2010-07-06 12 views
8

Ho una matrice dinamica. Ma inizialmente non conosco la lunghezza dell'array. Posso fare come prima ho impostato la lunghezza di esso come 1 e quindi aumentare la lunghezza di cui avevo bisogno senza perdita di dati precedentemente memorizzati?
So che posso eseguire tale attività utilizzando TList. Ma voglio sapere se posso farlo con array o no?Posso ridimensionare un array Delphi senza perdere i suoi contenuti precedenti?

+0

Hai letto la documentazione sugli array dinamici? Quale parte di esso non hai capito? –

risposta

15

matrici dinamiche possono essere ridimensionate a una dimensione più grande senza perdere i dati contenuti.

Il seguente programma dimostra questo in azione.

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

Tieni presente che può essere un'operazione che richiede un uso intensivo della memoria, poiché l'intero array potrebbe essere spostato se non c'è spazio sufficiente per estenderlo dove è allocato. Un array, a differenza degli elenchi, deve essere allocato in un blocco di memoria contiguos. Ecco perché esiste una lista (e altri contenitori). Usa il miglior contenitore per te. –

+5

@ldsandon: fai attenzione: molte "liste" in Delphi sono implementate come array o almeno blocchi di memoria contigui esattamente nello stesso modo di un array "sotto il cofano". TList, TObjectList, TStringList ... questi elenchi più comunemente rilevati sono tutti array effettivamente all'interno di object wrappers. La "Lunghezza" di questi "array" ha tuttavia strumenti di gestione più flessibili rispetto agli array "reali", in quanto supportano sia Capacity (dimensione della "matrice") che Count (numero di elementi effettivamente utilizzati) in modo da poter pre-allocare la memoria contigua che ti serve (via Capacity) prima di riempirla. – Deltics

+1

Un punto di chiarimento che potresti già sapere. Non so se una qualsiasi di queste ottimizzazioni sia importante per le macchine di oggi, ma l'esempio sopra chiama SetLength() per * ogni * nuovo elemento. Come osserva il commento di Idsandon, SetLength può richiedere un uso intensivo della memoria. In questo caso, chiamare SetLength() meno spesso potrebbe essere più veloce. Ad esempio, puoi chiamarlo una volta ogni 100 (o anche 1000) elementi. Naturalmente, si avrebbe dovuto tenere traccia di quando è necessario chiamare: se (Lunghezza (A) <(I + 1) allora SetLength (A, I + 100); – RobertFrank

Problemi correlati