![]() |
Dynamisches Array speichern und einlesen
Ich muss ein dynamisches Array speichern, und natürlich auch wieder einlesen.
Bei einem Statischen Array klappt das Speichern mit diesem Code:
Delphi-Quellcode:
Bei einem dynamischen Array versagt die Routine aber. Worauf muss ich da achten?
var
A : array[0..99,0..99,0..99] of double ; begin FS := TFileStream.Create(txtfilename.text,fmCreate); try FS.Write (A,sizeof(A)) ; finally FS.free ; end ; end ; |
Re: Dynamisches Array speichern und einlesen
Zitat:
Die Frage ist: Willst du überhaupt ein normales Array nehmen? Wäre maximovs Template version der ![]() |
Re: Dynamisches Array speichern und einlesen
Ich habs jetzt irgendwie so hingekriegt:
Delphi-Quellcode:
Das klappt soweit. Auslesen halt analog.
FS := TFileStream.Create(txtfilename.text,fmCreate);
try FS.Write(N,sizeof(N)) ; for x := 0 to N-1 do for y := 0 to N-1 do for z := 0 to N-1 do begin FS.Write(A[x,y,z],SizeOf(TRecord)) end ; finally FS.free ; end ; Die Sache mit der Collection wäre auch ne Möglichkeit, allerdings hab ich jetzt schon die ganzen Daten in Arrays vorliegen, und die Zeit fehlt mir das zu ändern. |
Re: Dynamisches Array speichern und einlesen
Du musst deinen Code nur minimal abändern:
Code:
Grund: dynamische Array-Variablen sind nur Zeiger auf das Array. TFileStream.Write verlangt aber keine Adresse, sondern ein Datum, und das lieferst du mit A[0]. Und die Größe des Arrays im Speicher ist die Anzahl der Elemente mal der Größe eines Elements.
var
A : array[0..99,0..99,0..99] of double ; begin FS := TFileStream.Create(txtfilename.text,fmCreate); try FS.Write (A[b][0][/b], [b]length(A) * sizeof(A[0][/b]) ; finally FS.free ; end ; end ; |
Re: Dynamisches Array speichern und einlesen
Also erstmal zu dem :
length(A) * sizeof(A[0] bei einem 10 mal 10 array ergibt das 40 und keine hundert... hab ich da was falsch verstanden?? Und kann mir das nochmal jemand erklären ich habe nämlich das gleiche Problem nur bei mir funktioniert das ganze ganz und gar nicht.... Wenn ich mein dyn. Array Speicher speichert er das nicht vollständig ab und das lesen klappt dann gar nicht. Das wäre meine Procedure zum Laden:
Delphi-Quellcode:
procedure TForm1.LadenClick(Sender: TObject);
var FS : TFileStream; svMatrix : array of array of integer; begin if OpenDialog1.Execute then begin FS := TFileStream.Create(OpenDialog1.FileName,fmOpenRead); try FS.Read (svMatrix[0], length(svMatrix) * sizeof(svMatrix[0]) ; finally FS.free ; end ; end; end; und das zum Speichern....
Delphi-Quellcode:
Habe das mit ner einfachen for Schleife bei mir mit Werten belegt aber beim einlesen kommt nix.
procedure TForm1.SpeichernClick(Sender: TObject);
var FS : TFileStream; svMatrix : array of array of integer; begin if SaveDialog1.Execute then begin FS := TFileStream.Create(SaveDialog1.FileName,fmCreate); try FS.Write (svMatrix[0], length(svMatrix) * sizeof(svMatrix[0]) ; finally FS.free ; end ; end; end; Was mache ich falsch? |
Re: Dynamisches Array speichern und einlesen
Dynamische Arrays sind erstmal Zeiger. Ein 10 mal 10 Array ist also eine Liste von 10 Zeigern auf andere Speicherbereche. Du hast keinen zusammengehörigen Speicherbereich, deshalb musst du alles auf eindimensionale Arrays zurückführen und die einzeln abspeichern.
|
Re: Dynamisches Array speichern und einlesen
Und warum funktioniert dann der mein Code nicht?
|
Re: Dynamisches Array speichern und einlesen
Zitat:
|
Re: Dynamisches Array speichern und einlesen
Dass muss aber irgendwie so funktionieren,
dass man dass ganze mit einem Befehl in den Stream schreibt! Denn bei Strings funktioniert das ja auch, und da ist auf Position 0 ja auch ein Zeiger. :-D |
Re: Dynamisches Array speichern und einlesen
Moin mytar,
Zitat:
Eine Stringvariable (Huge Strings) enthält einen Zeiger auf das erste Zeichen des Strings in den vier Zeichen vor dem ersten Zeichen steht die Länge, und die davor liegen vier Byte enthalten einen Referenzzähler. Würdest Du nur
Delphi-Quellcode:
angeben, würdest Du den Wert des Pointers und die Bytes dahinter schreiben.
fs.Write(StringVariable,...);
Erst
Delphi-Quellcode:
schreibt den Inhalt des Strings.
fs.Write(StringVariable[1],...);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz