Hallo Peter,
Delphi nimmt die einen großen Teil des Aufwandes ab. Natürlich kannst du auch ein dynamsiches Array verwenden und muss nicht die Krücke "array [0 .. 100000] of byte" nehmen.
Dafür musst du aber den Unterschied verstehen.
Bei einem statischen Array ist zur Compilerzeit bekannt wie groß dieses Array ist, und es hat immer mindestens einen Eintrag [0..0].
D.h. @StatischesArray und @StatischesArray[0] das gleiche.
Bei dynamischen Arrays ist das aber anders aus, da du die Länge ja zur Laufzeit verändern kannst (SetLength).
Daher sind @DynamischesArray und @DynamischesArray[0] unterschiedliche Dinge.
@DynamischesArray ist ein Zeiger auf das Array (PPointer). 4 Bytes vor jedem dynamischen Array steht die Länge.
@DynamischesArray[0] zeigt auf das 1. Element (das was du haben willst).
Wenn du also Speicher in ein dynamisches Array kopieren willst kannst du das am besten so machen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TData = array of TStruct; var a: TData; begin SetLength(a, 10); if Length(a) > 0 then begin CopyMemory(@a[Low(a)], srcpointer, Length(a) * SizeOf(a[Low(a)])); end; |
Hier sieht du den Unterschied zwischen @DynArr und @DynArr[0]
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TStruct = record a: Integer; b: Integer; end; var arr: array of TStruct; begin SetLength(arr, 3); Caption := Format('%x %d %x' ,[ Integer(PPointer(@arr)^), Integer(PInteger(Integer(PPointer(@arr)^)-4)^), Integer(@arr[0]) ]); |
Natürlich solltest du nicht auf das Array bzw. die Länge wie im obigen Beispiel zugreifen.
Sondern "Length", "SetLength", "@Arr[Low(Arr)]" etc. nutzen.
Delphi nimmt dir halt einen großen Teil ab, so kann man ganz einfach das dynamische Array vergrößern:
Delphi-Quelltext
1:
| SetLength(a, Length(a)+1); |
Delphi reserviert den Speicher automatisch und kopiert die Elemente um, wenn dies nötig ist.
Außerdem musst du dich bei dynamischen Arrays nicht darum sorgen wann der Speicher wieder freigegeben werden soll (FreeMem etc.)
Wenn du länger mit Delphi arbeitest wirst du schon die Vorzüge von kennen lernen
Wenn du einzelne Records kopieren willst geht das auch über das dereferenzieren:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| type TStruct = record a: Integer; b: Integer; end; PStruct = ^TStruct; var x, y: TStruct; z: PStruct; begin x.a := 1; x.b := 1;
z := @x;
y := z^; |