2010-07-06 12 views
8

Ich habe ein dynamisches Array. Aber ich kenne die Länge des Arrays zunächst nicht. Kann ich zuerst tun, ich setze die Länge von 1 und dann die Länge wie ich brauchte, ohne vorher gespeicherte Daten verloren zu haben?
Ich weiß, dass ich eine solche Aufgabe mit TList tun kann. Aber ich möchte wissen, ob ich es mit Array machen kann oder nicht?Kann ich die Größe eines Delphi-Arrays ändern, ohne den vorherigen Inhalt zu verlieren?

+0

Haben Sie die Dokumentation über dynamische Arrays gelesen? Welchen Teil davon hast du nicht verstanden? –

Antwort

15

Dynamische Arrays können zu einer größeren Größe geändert werden, ohne die enthaltenen Daten zu verlieren.

Das folgende Programm demonstriert dies in Aktion.

program Project7; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils; 
var 
A : Array of Integer; 
I : Integer; 
begin 
    for I := 0 to 19 do 
    begin 
    SetLength(A,I+1); 
    A[I] := I; 
    end; 
    for I := Low(A) to High(A) do 
    begin 
    writeln(A[I]); 
    end; 
    readln; 
end. 
+10

Beachten Sie, dass es sich um eine speicherintensive Operation handeln kann, da das gesamte Array verschoben werden kann, wenn nicht genügend Speicherplatz vorhanden ist, um es an der zugewiesenen Stelle zu erweitern. Ein Array muss im Gegensatz zu Listen in einem Contiguos-Speicherblock zugeordnet sein. Deshalb gibt es eine Liste (und andere Container). Verwenden Sie den besten Behälter für Ihre Bedürfnisse. –

+5

@ldsandon: Vorsicht: Viele "Listen" in Delphi sind als Arrays oder zumindest zusammenhängende Speicherblöcke genau wie ein Array "unter der Haube" implementiert. TList, TObjectList, TStringList ... diese am häufigsten vorkommenden Listen sind alle effektiv Arrays innerhalb von Objekt-Wrappern. Die "Länge" dieser "Arrays" hat flexiblere Verwaltungstools als "echte" Arrays, da sie sowohl die Kapazität (Größe des "Arrays") als auch die Anzahl (Anzahl der tatsächlich verwendeten Elemente) unterstützen, so dass Sie sie vorbelegen können den zusammenhängenden Speicher, den Sie benötigen (über Kapazität), bevor Sie ihn füllen. – Deltics

+1

Ein Punkt der Klarstellung, den Sie vielleicht schon kennen. Ich weiß nicht, ob diese Optimierung für moderne Maschinen wichtig wäre, aber das obige Beispiel ruft SetLength() für * jedes * neue Element auf. Wie der Kommentar von Idsandon bemerkt, kann SetLength speicherintensiv sein. Wenn dies der Fall ist, könnte der Aufruf von SetLength() weniger oft schneller sein. Zum Beispiel könnten Sie es alle 100 (oder sogar 1000) Elemente aufrufen. Natürlich müssten Sie verfolgen, wenn Sie es anrufen müssen: if (Länge (A) <(I + 1) dann SetLength (A, I + 100); – RobertFrank

Verwandte Themen