Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record als Eigenschaft von sich selber (https://www.delphipraxis.net/146408-record-als-eigenschaft-von-sich-selber.html)

MisterNiceGuy 19. Jan 2010 12:30


Record als Eigenschaft von sich selber
 
Schwer dieses Thema zu beschreiben, ich zeig mal an einem Beispiel was ich erreichen möchte:

Delphi-Quellcode:
type TAst = record
   UnterAst : TAst;
end;
Ich möchte also, dass mein Record sich selbst als Unterlement besitzt. Geht das irgendwie?

Reinhardtinho 19. Jan 2010 12:37

Re: Record als Eigenschaft von sich selber
 
Ich kenne es so, das man bei einem Record einen Zeiger auf den nächsten Record hat.

Delphi-Quellcode:
type
  PAst = ^TAst;
  TAst = record
    UnterAst : PAst;
  end;
end;

MisterNiceGuy 19. Jan 2010 12:44

Re: Record als Eigenschaft von sich selber
 
Danke das geht, dann wirds wohl ein Pointer... :)

uligerhardt 19. Jan 2010 12:56

Re: Record als Eigenschaft von sich selber
 
Zitat:

Zitat von MisterNiceGuy
Delphi-Quellcode:
type TAst = record
   UnterAst : TAst;
end;

Überleg dir mal, wie eine Variable von diesem Typ im Speicher ausschauen würde.
Vor allem, wenn UnterAst nicht das einzige Feld in TAst wäre.

s.h.a.r.k 19. Jan 2010 12:57

Re: Record als Eigenschaft von sich selber
 
Bei solchen Sachen würde ich dann auch eher zu Klassen tendieren, da diese da einfach mächtiger sind. Dort hast du auch einfach mehr Flexibilität.

himitsu 19. Jan 2010 13:08

Re: Record als Eigenschaft von sich selber
 
Grund: Der Record ist zu diesem Zeitpunkt (also innerhlab seiner eigenen Deklaration) noch nicht fertig.
Der Compiler weiß also noch nicht wie groß dieser mal wird
und kann demnach die Position des nächsten Feldes nicht berechnen.

Grund2: Dieses würde einen unendlichgroßen Record ergeben,
welches einfach nicht möglich ist.
> der Record wäre ja unendlich Mal in sich selber verschachtelt


Bei Objekten geht das, da dort zum Zeitpunkt der Kompilierung die Größe des Instanzzeigers ja schon feststeht.
Und da eine Klasse ein Zeiger ist, wird dieses auch nur einmal verschachtelt.

Medium 19. Jan 2010 14:07

Re: Record als Eigenschaft von sich selber
 
In Delphi muss bei solchen Strukturen in einer Klasse (wegen Grund 1) zudem eine Forward-Deklaration vorgenommen werden:
Delphi-Quellcode:
type
  TFoo = class;
  TFoo = class(TBar)
  private
    FSubFoo: TFoo;
  public
    // bla
  end;
Schaut erstmal nicht wirklich intuitiv aus, daher sei's gesagt.

himitsu 19. Jan 2010 14:16

Re: Record als Eigenschaft von sich selber
 
Zitat:

Zitat von Medium
Forward-Deklaration vorgenommen werden:

Die Forward-Deklaration ist hier nicht nötig, da der Typ schon bekannt ust und auch daß es sich um eine Klasse handelt.
(aber schaden tut's zumindestens nichts)

Das Problem liegt z.B. hier an der Tatsache, daß TFuu erst später deklariert wird und zu diesem Zeitpunkt also noch unbekannt ist.
Delphi-Quellcode:
type
  TFuu = class;
  TFoo = class(TBier)
    FSubFuu: TFuu;
  end;
  TFuu = class(TBar)
  end;

Medium 19. Jan 2010 14:33

Re: Record als Eigenschaft von sich selber
 
Wa echt? Hui, dann hab ich das wohl mit 2 Klassen die sich gegenseitig referenzieren verdurmschelt. Scusi :)

p80286 19. Jan 2010 15:16

Re: Record als Eigenschaft von sich selber
 
@MisterNiceGuy

Wozu soll das Gut sein?
irgendwie reicht meine Phantasie nicht dafür aus.

Gruß
K-H

implementation 19. Jan 2010 16:01

Re: Record als Eigenschaft von sich selber
 
Er will sich einen Baum basteln.
Vielleicht sollte er eindimensional bleiben, vielleicht wäre eine zweite (dritte) Dimension ergänzt worden.
Mit einem zweidimensionalen Baum kann man bspw. Menüs darstellen.

mimi 19. Jan 2010 16:08

Re: Record als Eigenschaft von sich selber
 
Baum-Strukturen würden sich nicht nur für Menüs eigenen:
TreeView, ListView,....

implementation 19. Jan 2010 16:12

Re: Record als Eigenschaft von sich selber
 
War auch nur ein Beispiel. Geht für so alles Mögliche.

Ein eindimensionaler Baum würde sich auch als Liste, Queue, Stapel oder ähnliches eignen.

Wofür man aber einen Baum mit drei oder mehr Dimensionen eignen würde, da geht mir die Fantasie aus.

MisterNiceGuy 19. Jan 2010 16:15

Re: Record als Eigenschaft von sich selber
 
Ah hab nicht so weit gedacht, dass speicher direkt beim Initialisieren der Record-Instanz reserviert wird. Dann ist auch klar, dass das nicht geht ;)

Und ja, es wird ein Baum für einen SceneGraph für Grafiken.

p80286 19. Jan 2010 16:20

Re: Record als Eigenschaft von sich selber
 
Na für soetwas empfehle ich doch die klassische n-fach verkettete Liste
Delphi-Quellcode:
Type
  precord=^trecord;
  trecord= record
    next : precord;
    ...
    daten: tdaten;
  end;
wobei daten irgendeine Struktur sein kann incl. (Byte,Char,integer usw.)

Gruß
K-H

MisterNiceGuy 19. Jan 2010 16:22

Re: Record als Eigenschaft von sich selber
 
Jupp, so hab ich's auch letztendlich gelöst ;)

mimi 19. Jan 2010 16:23

Re: Record als Eigenschaft von sich selber
 
Zitat:

Wofür man aber einen Baum mit drei oder mehr Dimensionen eignen würde, da geht mir die Fantasie aus.
Bestes Beispiel dürfte die VST sein. Die setzt auf eine Baumstruktur und unterstützt eine Spalten Ansicht. Außerdem werden Record's eingesetzt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz