![]() |
Record und Array forwarded deklarieren
Ich bin vor kurzem über folgende Konstruktion gespolpert:
Delphi-Quellcode:
In meinem Fall hat sich das schon geklärt, weil ich nur Pointer im Record benutzen kann, aber ist so was rein theoretisch möglich? Gibt es irgendein
type
TMyArray = array of TMyRecord; TMyRecord = record [..] flomp: TMyArray; end;
Delphi-Quellcode:
oder etwas in der Art?
TMyArray = arrray; forward;
|
Re: Record und Array forwarded deklarieren
Vorweggenommen, ich weiß es nicht, ob es sowas gibt aber:
es erscheint mir problematisch eine solche Konstruktion zuzulassen, da sie eine unendliche Liste von Records erzeugen würde, nicht nur unendlich in der Länge, auch in den Dimensionen !
Delphi-Quellcode:
Eine solche unendlich komplexe Struktur - wer kann sie brauchen? :zwinker:
TMyRecord=record
x: integer; y: integer; f: array of TMyRecord; end; x, y ,f[0].x, f[0].y, f[1].x, f[1].y, ..., f[n].x, f[n].y aber auch: f[0].f[0].x, f[0].f[0].y, f[0].f[1].x, f[0].f[1].y, ...,f[0].f[n].x, f[0].f[n].y f[1].f[0].x, f[1].f[0].y, f[1].f[1].x, f[1].f[1].y, ...,f[1].f[n].x, f[1].f[n].y . . . f[n].f[0].x, f[n].f[0].y, f[n].f[1].x, f[n].f[1].y, ...,f[n].f[n].x, f[n].f[n].y aber auch: f[0 bis n].f[0 bis n]... f[0 bis n].f[0 bis n].f[0 bis n]... . . . n=unendlich |
Re: Record und Array forwarded deklarieren
Unendlich wirds sicherlich nicht sein. Ich sehe kein Problemm damit. :roll:
|
Re: Record und Array forwarded deklarieren
Doch, es ist unendlich. Du versuchst zwar, mit einem dynamischen Array das Problem der Unendlichkeit zu umgehen (Dein 'flomp' ist ja in Wirklichkeit ein Pointer), aber Delphi lässt das eben nicht zu(Aus gutem Grund). Was du machen willst, ist Folgendes;
Delphi-Quellcode:
Jetzt kann man die Größe des TMyRecord angeben (4008 Bytes). Bei Klassen hingegen wäre deine Deklaration ok, weil TMyClass sowohl die Klasse, als auch den Verweis bezeichnet.
Type
PMyRecord = ^TMyRecord; // erlaubt, obwohl TMyRecord noch nicht definiert ist TMyRecord = Record mrFoo : Integer; mrBar : Array of PMyRecord; End;
Delphi-Quellcode:
TMyClass = Class
private fFoo : Integer; fBar : Array Of TMyClass; ... end; |
Re: Record und Array forwarded deklarieren
@sniper
versuch mal meine Auflistung zu verstehen, ist ein bissel vewirrend und auch mathematisch nicht ganz korrekt notiert, aber nachvollziehbar ... Angenommen du hast T: TMyRecord; dann hast du: T.x T.y aber auch T.f weil T.f ja vom Typ TMyRecord ist, heißt das du hast: T.f.x T.f.y aber auch T.f.f usw., also unendlich. Da in dem Beispiel aber f nicht einfach nur TMyRecord ist, sondern noch ein Array von TMyRecord, ist nicht nur die Länge unendlich, sondern auch die komplexität bwz. die Dimensionen. Die Auflistung versucht das deutlich zu machen. |
Re: Record und Array forwarded deklarieren
Zitat:
Aber ich denke trotzdem nicht das mein Beispiel zwangsläufig unendlich werden würde. Angenommen ich habe am Anfang ein Record (R). Dann habe ich da drin auf jeden Fall ein Array (R.A) Diesem Array kann ich zum Beispiel die Länge 2 geben. Dadurch bekomme ich 2 neue Records (R.A[0] und R.A[1]) Jeder dieser Records hat wieder ein Array (R.A[0].A und R.A[1].A) Wenn ich jetzt aber diesen beiden Arrays die Länge 0 gebe, hört es hier auf. Es würde sich doch theoretisch ein Baum bilden der an jedem Knoten (Record) so viele neue Äste hat wie das Array (Length(Array)). Am Ende dieses Baumes hat man überall ein Array der Länge 0. |
Re: Record und Array forwarded deklarieren
Innerhalb ein und des selben Type-Abschnitts ist so eine Forward-Deklaration zulaessig.
"array of" ist die Deklaration eines Zeigers. Damit ist die Groesse des Elementes flomp innerhalb des Records aber bekannt. Die Alloziierung der Elemente von flomp erfolgt spaeter im Code mit dem Aufruf von SetLength(). |
Re: Record und Array forwarded deklarieren
Delphi-Quellcode:
liefert bei mir aber den Fehler [Error] Unit1.pas(11): Undeclared identifier: 'TMyRecord'
type
TMyArray = array of TMyRecord; TMyRecord = record [..] flomp: TMyArray; end;
Delphi-Quellcode:
Hier kommt [Error] Unit1.pas(12): Type 'TMyRecord' is not yet completely defined
type
TMyRecord = record [..] flomp: array of TMyRecord; end; Muss man da noch irgendwas kennzeichnen, damit das erlaubt wird? |
Re: Record und Array forwarded deklarieren
Zitat:
|
Re: Record und Array forwarded deklarieren
Die Frage bezog sich auf den Post von Robert Marquardt
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz