Wybranie właściwego typu

0

Witam, mam następujący problem
Oto przykłądowy kod:

procedure AddFIRST(var albumH:albums,var artistH:artist; title:real);
var choosen:string;
begin
if (albumH <> nil) then choosen:=albumH
else choosen:=artistH;
//dalszy kod wykorzystujacy wskaznik choosen
end;

Wiem, że to bzdura. Mógłby ktoś pomóc mi, w implementacji takiego zadania.
Do procedury zostaje wczytany wskaźnik na Głowa z elementu strukutry albums lub artist, ale tylko jedna(druga przyjmuje wartość nil).
Potrzebuję takiego kodu, żeby mi tą główe wczytało na nową zminną, która przjmie jej typ, żeby później mógł jej używać w procedurze.
Dziękuję za pomoc i życzę Wesołych Świąt.

dodanie znacznika <code class="delphi"> - fp

0
SlimXmax napisał(a):

... żeby mi tą główe wczytało ...
Faktycznie, z tą głową jest coś nie tak.

0
_13th_Dragon napisał(a):
SlimXmax napisał(a):

... żeby mi tą główe wczytało ...
Faktycznie, z tą głową jest coś nie tak.
Widzę, że udziela Ci się miłosierny nastrój. Nie mógłby ktoś pomóc, stoję w martwym punkcie, a to na pewno banał.

Xnnax napisał(a):
_13th_Dragon napisał(a):
SlimXmax napisał(a):

... żeby mi tą główe wczytało ...
Faktycznie, z tą głową jest coś nie tak.
Widzę, że udziela Ci się miłosierny nastrój. Nie mógłby ktoś pomóc, stoję w martwym punkcie, a to na pewno banał.

Do sklejenia. Typ pointer załatwi sprawę?

0

Zmień język programowania na PHP wtedy się da ba jeszcze nie takie cuda da się odstawić.

0
_13th_Dragon napisał(a):

Zmień język programowania na PHP wtedy się da ba jeszcze nie takie cuda da się odstawić.
Z przyjemnościa, ale musze to wykonac w Pascalu niestety, a takie coś skróci mój kod o 2/3.

0

@SlimXmax - przede wszystkim nie podawaj przykładowego kodu tylko taki, który chciałbyś użyć;

Po drugie pokaż deklaracje typów albums i artist i po trzecie wytłumacz, dlaczego title (tytuł) jest typu Real? Po tytule wątku i parametrach tej przykładowej procedury można się spodziewać, że chcesz dobrać typ dla zmiennej choosen tak, aby przypisać jej wartość albo typu albums, albo artist; Niestety nie można doradzić czegoś konkretnego nie wiedząc co dokładnie oznaczają i jakie dane przechowują te dwa typy.

0
furious programming napisał(a):

@SlimXmax - przede wszystkim nie podawaj przykładowego kodu tylko taki, który chciałbyś użyć;

Po drugie pokaż deklaracje typów albums i artist i po trzecie wytłumacz, dlaczego title (tytuł) jest typu Real? Po tytule wątku i parametrach tej przykładowej procedury można się spodziewać, że chcesz dobrać typ dla zmiennej choosen tak, aby przypisać jej wartość albo typu albums, albo artist; Niestety nie można doradzić czegoś konkretnego nie wiedząc co dokładnie oznaczają i jakie dane przechowują te dwa typy.

Dzięki za odpowiedź. Rzeczywiście w tym title jest błąd. Wobec tego:

type
artists:^artist;
albums:^album;

artist=record
  title:string;
  id:integer;
  next:artist;
end;

album=record
  title:string;
  artist:features;
  next:albums;
end;

procedure AddFIRST(var albumH:albums,var artistH:artists; title:string);
var choosen:string;//?
begin
if (albumH <> nil) then choosen:=albumH
else choosen:=artistH;
//dalszy kod wykorzystujacy wskaznik choosen
end;

Niestety, pomimo tego, że typy są bardzo podobne, to są jeszcze bardziej rozbudowane więc musiałem je rozdzielić, tylko tutaj je maksymalnie uprościłem, na potrzebę przykładu.
Chodzi dokładnie o to, o czym napisałeś. Da się wgl coś takiego zrobić? Dzięki za propozycje i Radosnych Świąt:).

zamiana znacznika <code class="c"> na <code class="delphi"> - fp

0

Jeżeli przerobisz na klasy z odpowiednią hierarchią to się da ale bardzo koślawe to będzie. Gdyby tak powiedziałeś co chcesz przez to osiągnąć?

0
_13th_Dragon napisał(a):

Jeżeli przerobisz na klasy z odpowiednią hierarchią to się da ale bardzo koślawe to będzie. Gdyby tak powiedziałeś co chcesz przez to osiągnąć?

Nie znam się na programowaniu, obiektowym, ale domyślałem się, że tutaj by się sprawdziło. Po prostu jestem zmuszony korzystać z wielu struktur, których obsługa tj. przechodzenie, edytowanie, usuwanie jest prawie identyczna, więc wygodnie byłoby mi przez definicje procedury wprowadzić dany wskaźnik na głowę, a w środku sprawdzić na jakiej strukturze działam, i wykonać na niej zadanie.

0

@XmaxTime - teraz z kolei nie podałeś deklaracji typu features :]

Póki co raczej nie zrobisz tego co chcesz, bo te dwa rekordy są inne, więc jedynym rozwiązaniem było by pobranie wskaźnika; To i tak nie rozwiąże problemu, bo dalszy kod i tak musiałby sprawdzać co siedzi pod tym wskaźnikiem i wykorzystywać rzutowanie aby dostać się do odpowiednich pól;

Musisz pokazać ten "dalszy kod" aby można było cokolwiek doradzić; Jednak na chwilę obecną wygląda to dość nietypowo - lepiej było by po prostu rozdzielić tę procedurę na dwie osobne - wtedy będzie wiadomo co jest przekazywane w argumencie i nie trzeba będzie rzutować; Będzie to wygodniejsze i czytelniejsze, jednak część kodu zapewne będzie trzeba powielić, co i tak będzie imho lepsze;

Deklaracja tych abu struktur wygląda tak, jakbyś chciał na ich podstawie budować listę jednokierunkową, ale jej węzły mogą być różnego typu; To też da się ze sobą pogodzić i taką listę zbudować, jednak musisz napisać co dokładnie chcesz zrobić.

0

Features nie ma akurat znaczenia ale wkleje mam nadzieję, że tym razem pełny kod ;).

type
artists:^artist;
albums:^album;
features:^feature;

artist=record
  title:string;
  id:integer;
  next:artist;
end;
 
album=record
  title:string;
  artist:features;
  next:albums;
end;

feature=record
  id:integer;
  artist:artist;
  next:features;
end; 
 
procedure AddFIRST(var albumH:albums,var artistH:artists; title:string);
var choosen:string;//?
begin
if (albumH <> nil) then choosen:=albumH
else choosen:=artistH;
//dalszy kod wykorzystujacy wskaznik choosen
end;

Mam nadzieję, że jest już wszytko. Też zauważyłem, że odzielnie robią te procedury będzie nawet trochę wydajniej bo nie będzię trzeba sprawdzać, co weszło do procedury i tak zrobiłem. Teraz już pytam czysto teoretycznie, może przydać mi się kiedyś. Jak to właśnie przerzutować tak żeby nie tylko móc przechodzić strukturę, ale móc na niej używać funkcji new i dispose. Tak zadziała?:

procedure AddFIRST(var albumH:albums,var artistH:artist; title:string);
var choosen:pointer;
begin
if (albumH <> nil) then choosen:=albumH;
else choosen:=artistH;
        new(choosen);
        choosen^.title:=title;
        choosen^.next:=nil;
end;

usunięcie cytowania całego poprzedniego posta + dodanie znaczników <code class="delphi"> - fp

0

Też zauważyłem, że odzielnie robią te procedury będzie nawet trochę wydajniej bo nie będzię trzeba sprawdzać, co weszło do procedury i tak zrobiłem.

To nie tylko chodzi o optymalizację, ale przede wszystkim o czytelność kodu; Nie rozumiem dlaczego jedna procedura miałaby robić dwie różne rzeczy (operować na dwóch różnych typach, które i tak mimo wszystko przekazywane są do procedury); Skoro tylko jeden typ będzie wykorzystywany w procedurze to nie powinieneś podawać ich dwóch i wybierać odpowiednią; Lepiej już napisać sobie dwie osobne, nawet jeśli część kodu będzie się powtarzać (to też będzie można skrócić);

Jak to właśnie przerzutować tak żeby nie tylko móc przechodzić strukturę [...]

W dalszym ciągu nie wiem co chcesz osiągnąć, więc nic mądrego nie mogę doradzić;

[...] ale móc na niej używać funkcji new i dispose. Tak zadziała?

New i Dispose to są procedury, nie funkcje; Możesz ich używać, ale nadal jedna funkcja służy do dwóch rzeczy i wciąż trzeba kombinować; Nie mam jak tego sprawdzić, bo podałeś kod jedynie części programu, jednak ten kawałek:

new(choosen);
choosen^.title:=title;
choosen^.next:=nil;

nawet się nie skompiluje, bo zmienna choosen jest typu ogólnego, który nie jest strukturą i nie zawiera pól, więc tak tego nie użyjesz; Możesz sobie zadeklarować dwa wskaźniki tych dwóch róznych typów i używać tylko tego jednego - odpowiedniego, ale w dalszym ciągu będą to kombinacje, które posłużą jedynie do zaciemnienia kodu; Po raz kolejny nalegam, aby rozdzielić tę procedurę na dwie mniejsze, operujące na tylko jednym typie każda; Inaczej będziesz miał w kółko problemy i kolejne pytania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1