Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Mehrdimensionales, dynamisches Array speichern (https://www.delphipraxis.net/159643-mehrdimensionales-dynamisches-array-speichern.html)

Dunkelbunt27 6. Apr 2011 16:55

Mehrdimensionales, dynamisches Array speichern
 
Hallo Delphi-PRAXIS,

ich möchte mein zweidimensionales dynamsiches Array (mit Record) in einer Datei speichern und wieder laden.
Kann mir jemand beschreiben wie das funktioniert?

(Die Suche hat mir nicht wirklich wieter geholfen...)

FG Dunkelbunt

DeddyH 6. Apr 2011 17:17

AW: Mehrdimensionales, dynamisches Array speichern
 
Die Array-Dimensionen sollen dabei erhalten bleiben, oder geht es rein um die Daten in den Records?

Dunkelbunt27 6. Apr 2011 17:19

AW: Mehrdimensionales, dynamisches Array speichern
 
Nein, es ist wichtig, dass die Dimensionen auch erhalten bleiben.

shmia 6. Apr 2011 17:23

AW: Mehrdimensionales, dynamisches Array speichern
 
Zum Beispiel als CSV-Datei.
Die ersten beiden Felder enthalten die Position im Array; anschliesend folgen die Daten der Struktur.
(ich nehme hier ein 2-dimensionales Array an)
Code:
0, 0, VW, blau, 90
0, 1, Audi, rot, 110
0, 2, Opel, rot, 75
1, 0, ....
So kann man auch Sparse Arrays speichern.
Vorteil der CSV-Datei ist die leichte Weiterverarbeitung in externen Tools.

Dunkelbunt27 6. Apr 2011 17:33

AW: Mehrdimensionales, dynamisches Array speichern
 
Hm, okay.
ich weiß nicht ganz wie ich vorgehen soll...

EDIT:
Ich hab es jetzt so 'versucht':

Delphi-Quellcode:
procedure Speichern;
var
Datei: TextFile;
Zeile, Spalte: string;
i, n : integer;
StringList1 : TStringList;
begin
Zeile:='';
Spalte := '';
StringList1 := TStringList.Create;
Try
for i := 0 to Length(Xdimension)  do
    for n := 0 to length(Ydimension) do
      begin
        Zeile := '';
        Zeile :=myarray[i,n].zeichen+';'+ IntToStr(myarray[i,n].attribut)+';';
        StringList1.Add(Zeile);
      end;
StringList1.SaveToFile(ExtractFilePath(Application.ExeName)+'test.CSV');
Finally
  StringList1.Free;
end;
end;
Ist das korrekt?

Wie kann ich das ganze jetzt wieder auslesen?

Bummi 6. Apr 2011 19:34

AW: Mehrdimensionales, dynamisches Array speichern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Vielleicht kannst Du damit was anfangen ...

ASM 7. Apr 2011 13:54

AW: Mehrdimensionales, dynamisches Array speichern
 
zur Unit uReadWrite_2D_Arrays:

Die mit der Verwendung des Parameters T2DStringArray überladenen Prozeduren Save2DArray() and Load2DArray() enthalten einen äußerst fatalen Fehler:
In den Anweisungen dieser beiden Prozeduren writer.Write() bzw. reader.Read() wird das Element [i,x] des Array A (also A[i,x]) ja nicht als String, sondern als Puffer übergeben. Daher muss zwingend als Start des übergebenen Puffers die erste Position des Stringelements A[i,x][1] gesetzt werden (nicht einfach nur A[i,x]).

Die beiden betroffenen Prozeduren müssen richtig wie folgt codiert sein:

Code:
procedure Save2DArray(const A: T2DStringArray; S: TStream); overload;
var
  writer: TWriter;
  i,x: Integer;
begin
  Assert(Assigned(S));
  writer := TWriter.Create(S, 8096);
  try
    writer.WriteInteger(Length(A));
    for i := 0 to Length(A) - 1 do
    begin
      writer.WriteInteger(Length(A[i]));
      for x := 0 to Length(A[i]) - 1 do
        begin
        Writer.WriteInteger(Length(A[i,x]));
        writer.Write(A[i, x][1], Length(A[i,x]));   // <-- !
        end;
    end; { For }
  finally
    writer.Free;
  end; { Finally }
end;
Code:
procedure Load2DArray(var A: T2DStringArray; S: TStream); overload;
var
  reader: TReader;
  i,x, numrows, numcols,slen: Integer;
begin
  Assert(Assigned(S));
  reader := TReader.Create(S, 8096);
  try
    numrows := reader.ReadInteger;
    SetLength(A, numrows);
    for i := 0 to numrows - 1 do
    begin
      numcols := reader.ReadInteger;
      SetLength(A[i], numcols);
      for x := 0 to numcols - 1 do
        begin
          slen := reader.ReadInteger;
          SetLength(A[i,x], slen);
          if slen>0 then
            reader.Read(A[i, x][1], slen);   // <-- !
        end;
    end; { For }
  finally
    reader.Free;
  end; { Finally }
end;

himitsu 7. Apr 2011 14:06

AW: Mehrdimensionales, dynamisches Array speichern
 
Bei Verwendung von ShortStrings kann man alle Strings einer Ebene zusammenhängens abspeichern/lesen und mü0te somit nur noch die i-Ebene durchlaufen

- kein Unicode (ShortStrings, also String[x] gibt es nur in ANSI)
- es wird immer die maximale Zeichenanzahl der Strings gespeichert

shmia 7. Apr 2011 15:52

AW: Mehrdimensionales, dynamisches Array speichern
 
Also ich würde schon bei einer CSV-Datei bleiben.
Binäre Datenformate sind so schwer zu debuggen und können nicht weiterverarbeitet werden.
Ich habe mal deine "Speicher"-Prozedur etwas aufgearbeitet.
Bei grösserer Datenmenge kann man dann auch auf einen TFileStream umschwenken,
um den Speicherverbrauch durch TStringList zu vermeiden.
Delphi-Quellcode:
procedure Speichern(const filename:string);
var
Datei: TextFile;
Zeile, Spalte: string;
i, n : integer;
StringList1 : TStringList;
begin
  StringList1 := TStringList.Create;
  Try
    for i := 0 to Xdimension-1 do
      for n := 0 to Ydimension-1 do
        begin
          Zeile := Format('%d;%d;', [i,n])+
             myarray[i,n].zeichen+';'+ IntToStr(myarray[i,n].attribut);
          StringList1.Add(Zeile);
        end;
    StringList1.SaveToFile(filename);
  Finally
    StringList1.Free;
  end;
end;

Dunkelbunt27 7. Apr 2011 15:58

AW: Mehrdimensionales, dynamisches Array speichern
 
Hallo,
Zitat:

Also ich würde schon bei einer CSV-Datei bleiben.
Danke, binäre Datenformate sind momentan etwas sehr kompliziert zu verstehen, da ich lieber etwas verwende, was ich auch verstanden habe. (trotzdem vielen Dank auch an die Anderen!)

Wie genau kann ich denn jetzt die Datei wieder auslesen? Und wie kann ich die Daten nun in mein Array kopieren?
Damit wäre mir sehr geholfen.

Fg Dunkelbunt


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:36 Uhr.
Seite 1 von 3  1 23      

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