aus der Delphi-Hilfe (im Hilfe-Index nach "dynamische Arrays" suchen):
Dynamische Arrays haben keine feste Größe oder Länge. Der Speicher für ein dynamisches Array
wird reserviert, sobald Sie dem Array ein Wert zuweisen oder es an die Prozedur SetLength
übergeben. Dynamische Array-Typen werden folgendermaßen deklariert:
array of baseType
Ein Beispiel:
var MyFlexibleArray: array of Real;
Hier wird ein eindimensionales Array mit Elementen vom Typ Real deklariert. Diese Deklaration
weist MyFlexibleArray keinen Speicherplatz zu. Um ein Array im Speicher anzulegen, rufen Sie
SetLength auf. Nach der vorherigen Typdeklaration weist
SetLength(MyFlexibleArray, 20);
ein Array mit 20 reellen Zahlen und einem Index von 0 bis 19 zu. Dynamische Arrays haben immer
einen Integer-Index, der bei 0 beginnt.
procedure TForm1.bTesteClick(Sender: TObject);
var
t : array of integer;
begin
setLength(t,1); // Länge auch mal testweise auf 2 setzen
t[0] := 3; // erlaubter Zugriff
t[1] := 5; // Schreibzugriff "hinter" das Array
lAusgabe.caption := IntToStr(t[1]); // löst Laufzeitfehler aus
lLaenge.caption := IntToStr(length(t));
end;
weiter aus der Delphi-Hilfe:
Dynamische Array-Variablen sind implizit Zeiger und werden mit derselben Referenzzählung
verwaltet wie lange Strings. Um ein dynamisches Array freizugeben, weisen Sie einer
Variablen, die das Array referenziert, den Wert nil zu, oder Sie übergeben die Variable an
Finalize. Beide Methoden geben das Array unter der Voraussetzung frei, dass keine weiteren
Referenzen darauf vorhanden sind. Dynamische Arrays werden immer freigegeben, sobald ihr
Referenzzähler auf null fällt. Dynamische Arrays der Länge 0 haben immer den Wert nil.
Verwenden Sie für dynamische Array-Variablen nicht den Derefenzierungsoperator (^), und
übergeben Sie sie auch nicht an die Prozeduren New oder Dispose.
Wenn X und Y Variablen desselben dynamischen Array-Typs sind, führt die
Anweisung X := Y dazu, dass X auf dasselbe Array wie Y zeigt.
(Es ist nicht erforderlich, vor dieser Operation Speicher für X zu reservieren.)
Im Gegensatz zu Strings und statischen Arrays wird COPY-ON-WRITE nicht für dynamische
Arrays verwendet. Deshalb werden diese nicht automatisch kopiert, bevor einem ihrer Elemente
ein Wert zugewiesen wird. Beispielsweise hat A[0] nach der Ausführung des folgenden
Quelltextes den Wert 2:
var
A, B: array of Integer;
begin
SetLength(A, 1);
A[0] := 1;
B := A;
B[0] := 2;
end;
Wenn A und B statische Arrays wären, hätte A[0] immer noch den Wert 1.
Durch Zuweisungen an ein dynamisches Array über den Index (wie beispielsweise
MyFlexibleArray[2] := 7) wird für das Array kein neuer Speicherplatz reserviert. Der
Compiler akzeptiert auch Indizes, die außerhalb des angegebenen Bereichs liegen.
Wenn Sie im Gegensatz dazu eine unabhängige Kopie eines dynamischen Arrays erstellen möchten,
müssen Sie die globale Funktion Copy verwenden:
var
A, B: array of Integer;
begin
SetLength(A, 1);
A[0] := 1;
B := Copy(A);
B[0] := 2; { B[0] <> A[0] }
end;
Bei einem Vergleich von dynamischen Array-Variablen werden nicht die Array-Werte, sondern
die Referenzen verglichen. Deshalb liefert A = B nach Ausführung des Quelltextes
var
A, B: array of Integer;
begin
SetLength(A, 1);
SetLength(B, 1);
A[0] := 2;
B[0] := 2;
end;
den Wert False, während A[0] = B[0] True zurückgibt.
Um ein dynamisches Array abzuschneiden, übergeben Sie es an SetLength oder Copy und weisen
das Ergebnis wieder der Array-Variablen zu. Die Prozedur SetLength ist normalerweise
schneller. Wenn A beispielsweise ein dynamisches Array ist, können Sie mit der Anweisung
A := SetLength(A, 0, 20) die ersten 20 Elemente von A beibehalten und den Rest abschneiden.
Sobald einem dynamischen Array Speicherplatz zugewiesen wurde, kann es an die
Standardfunktionen Length, High und Low übergeben werden. Length liefert die Anzahl der
Elemente im Array, High den höchsten Index des Arrays (Length–1) und Low den Wert 0.
Bei einem Array mit der Länge Null liefert High das Ergebnis -1 (mit der unsinnigen Folge,
dass High kleiner als Low ist).