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?
Antwort
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.
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. –
@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
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
- 1. Größe ändern, ohne Qualität zu verlieren mit Gimp
- 2. Wie kann ich die Größe einer mongodb-gedeckten Sammlung ändern, ohne Daten zu verlieren?
- 3. Wie kann ich die Größe eines Bildes ändern, ohne die Farben in einem Bild zu ändern?
- 4. wie die Größe eines Elements ändern, ohne seinen Inhalt zu ändern. css
- 5. Die Größe aller vorherigen WordPress Bilder ändern
- 6. Wie kann ich zusammenführen, ohne den Commit-Verlauf zu verlieren?
- 7. Ändern Sie den Spaltentyp, ohne Daten zu verlieren
- 8. Kann ich eine aktualisierte Struktur in eine MySQL-Tabelle importieren, ohne den aktuellen Inhalt zu verlieren?
- 9. Ändern Sie den Text eines attributierten UILabel ohne die Formatierung zu verlieren?
- 10. Größe eines Bildes mit .NET ändern, ohne EXIF-Daten zu verlieren
- 11. Hash ändern, ohne Datenbankbenutzer zu verlieren
- 12. Kann die Größe eines UIButton nicht ändern
- 13. Wie kann ich die Größe eines Sprites in Phaser/PixiJS skalieren, ohne seine Position zu ändern?
- 14. Wie kann ich die Größe eines iframe von innen ändern?
- 15. Wie reduziere ich Bilddatei, Größe ändern, ohne Qualität zu verlieren mit MultipleFileUpload in ASP.NET C#
- 16. Wie kann ich die Größe eines bestimmten Anwendungsfensters ändern?
- 17. Wie kann ich programmgesteuert die Größe eines UICollectionView ändern?
- 18. Wie kann ich ein Feld eines Meteor-Benutzerprofils aktualisieren, ohne die anderen zu verlieren?
- 19. Die Größe eines Layouts ändern
- 20. Größe ändern Eingang zu seinem Inhalt
- 21. Reduzieren Sie die Größe der Bilddatei ohne Größe und Qualität zu verlieren
- 22. So ändern Sie die Größe eines Videoseitenverhältnisses, ohne seine Proportionen zu beeinflussen (unrunde Zahlen)
- 23. Fügen Sie Zeilen zu einer DataTable hinzu, ohne die vorherigen Zeilen zu verlieren
- 24. wie zu dekodieren und kodieren base64 Bild, ohne die Qualität zu verlieren und die Größe
- 25. Wie kann ich die Größe eines DIV ändern, wenn der Browser die Größe ändert?
- 26. Wie kann ich den Inhalt einer Zelle drehen, ohne das Layout der Tabelle zu ändern
- 27. Excel-Datei lesen, ohne den Inhalt zu ändern
- 28. Wie kann ich die Versionierung implementieren, ohne den vorherigen Datensatz in DynamoDB zu ersetzen?
- 29. Größe ändern Bilder ohne JLabel
- 30. onchange ohne Fokus zu verlieren?
Haben Sie die Dokumentation über dynamische Arrays gelesen? Welchen Teil davon hast du nicht verstanden? –