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?
risposta
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.
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. –
@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
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
- 1. Come ridimensionare l'immagine senza perdere la qualità
- 2. Ridimensionare un'immagine con .NET senza perdere i dati EXIF
- 3. Come posso ridimensionare una collezione limitata di mongodb senza perdere i dati?
- 4. Autofit WinForms RichTextBox ai suoi contenuti
- 5. ridimensionare l'immagine senza perdere la qualità con Gimp
- 6. Il modo migliore per fare serializzazione e deserializzazione di un oggetto senza perdere i suoi ascoltatori?
- 7. Cancellare una cartella e tutti i suoi contenuti con Qt?
- 8. Ripristina senza perdere i file già impegnati
- 9. Come smettere di ridimensionare la tabella quando i contenuti crescono?
- 10. Come posso compilare il codice Delphi documentato nelle versioni Delphi precedenti (<2005)
- 11. Come disinstallare Android Apk senza perdere dati?
- 12. Ottenere il contenuto di un elemento SENZA i suoi figli
- 13. Il file atomico salva su Linux senza perdere i metadati
- 14. Come posso interrogare un cluster Cassandra per i suoi metadati?
- 15. Come posso ordinare un data.frame con una sola colonna, senza perdere i nomi dei giocatori?
- 16. iOS - Ridimensionare UIWebView per adattarsi ai contenuti?
- 17. Django: prima che un modello venga aggiornato, mi piacerebbe "guardare" i suoi attributi precedenti
- 18. Come ridimensionare un array HDF5 con `h5py`
- 19. Come impedire ai contenuti di ridimensionare un elemento flessibile?
- 20. onchange senza perdere la concentrazione?
- 21. Come convertire i contenuti STDIN in un array?
- 22. MySql, c'è un modo per convertire il campo Integer in Varchar senza perdere i dati?
- 23. Come posso ridimensionare un SVG?
- 24. Come aggiungere una colonna in una tabella usando la migrazione di laravel 5 senza perdere i suoi dati?
- 25. Come posso ridimensionare i punti in Dygraphs?
- 26. Ottenere i record precedenti e precedenti all'interno della stessa query
- 27. Android ExifInterface saveAttributes() Senza sovrascrivere i dati precedenti?
- 28. rendimenti senza precedenti di Logger
- 29. BigQuery - filtraggio senza perdere 'null' valori
- 30. Delphi: Mostra finestra senza attivazione
Hai letto la documentazione sugli array dinamici? Quale parte di esso non hai capito? –