Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi kurze Frage: geht record mit dynamischem array? (https://www.delphipraxis.net/125068-kurze-frage-geht-record-mit-dynamischem-array.html)

changlee 30. Nov 2008 09:06


kurze Frage: geht record mit dynamischem array?
 
Hallo,

ich bin gerade etwas verunsichert. Hier im Forum habe ich ein paar Beiträge gefunden, die darauf hindeuten, dass man kein dynamisches Array in ein record packen sollte. (Zumindest nicht ohne weitere Maßnahmen).
Ich habe daraufhin getestet und konnte keine Fehler festsellen. Möglicherweise war mein Test jedoch nicht representativ.

Also hier jetzt um sicher zu gehen:

Delphi-Quellcode:
TNormalRecord = record
  Feld_1 : integer;
  Feld_2 : string;
end;

TDynIntRecord = record
  Feld_1 : integer;
  Feld_2 : string;
  Feld_3 : array of integer;
end;

TDynIntStrRecord = record
  Feld_1 : integer;
  Feld_2 : string;
  Feld_3 : array of integer;
  Feld_4 : array of string;
end;
Der erste Record ist ja ganz normal. Ich kann ohne weitere Umstände auf ihn zugreifen.
Den zweiten record würde ich eigentlich genauso benutzen wie den ersten, nur würde ich vor einer Zuweisung auf Feld_3 schreiben:

Delphi-Quellcode:
  setlength(DynIntRecord.Feld_3,1); // setzt die Länge auf 1
Genau so würde ich dann auch beim letzten Record vorgehen.
So hat es in meinen Tests zumindest funktioniert. Das einzige was seltsam war: Ich habe mal auf einen Array-Index zugegriffen, der außerhalb der gesetzten Länge lag und trotzdem keine Exception bekommen. Stattdessen habe ich (im Integer Array) eine Null zurückbekommen.
Ein anderes Mal bekam ich hingegen eine Exception. Ich weiß nicht was bei den beiden Aufrufen untershiedlich war.

Kann ich meine Arrays so nutzen, wie ich sie oben aufgeschrieben habe?

Gruß
Stefan.

sirius 30. Nov 2008 09:39

Re: kurze Frage: geht record mit dynamischem array?
 
Ja kann man. Es gibt nur Probleme (die du wahrscheinlich in der DP gefunden hast) wenn man Streaming-Funktionen (also TFileStream o.ä.) damit benutzt.

Was deine Exception angeht:
Wenn du über die Länge des Arrays hinausschreibst, dann schreibst du halt irgendwohin. Das kann vorerst gut gehen. Aber wenn man etwas überschreibt, was man noch braucht, gibt es später Probleme. Oder du schreibst grad zufällig in einen verbotenen Bereich. Dann gibt es gleich eine Exception.
Du kannst im Compiler auch die Bereichsprüfung anschalten, dann bekommst du immer eine Exception.

changlee 30. Nov 2008 09:54

Re: kurze Frage: geht record mit dynamischem array?
 
Ok, dann kann ich meine Arrays ja bedenklos weiter verwenden.
Danke!
Stefan.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:17 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