AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Mehrdimensionales, dynamisches Array speichern
Thema durchsuchen
Ansicht
Themen-Optionen

Mehrdimensionales, dynamisches Array speichern

Ein Thema von Dunkelbunt27 · begonnen am 6. Apr 2011 · letzter Beitrag vom 11. Apr 2011
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#1

Mehrdimensionales, dynamisches Array speichern

  Alt 6. Apr 2011, 16:55
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 6. Apr 2011, 17:17
Die Array-Dimensionen sollen dabei erhalten bleiben, oder geht es rein um die Daten in den Records?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#3

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 6. Apr 2011, 17:19
Nein, es ist wichtig, dass die Dimensionen auch erhalten bleiben.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 6. Apr 2011, 17:23
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#5

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 6. Apr 2011, 17:33
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?

Geändert von Dunkelbunt27 ( 6. Apr 2011 um 18:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 6. Apr 2011, 19:34
Vielleicht kannst Du damit was anfangen ...
Angehängte Dateien
Dateityp: pas uReadWrite_2D_Arrays.pas (6,9 KB, 43x aufgerufen)
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
ASM

Registriert seit: 15. Aug 2004
165 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 13:54
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#8

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 14:06
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 15:52
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

Registriert seit: 10. Aug 2010
232 Beiträge
 
Delphi XE Professional
 
#10

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 15:58
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz