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
Benutzerbild von himitsu
himitsu

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

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
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
shmia

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

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
 
#3

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
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 16:18
naja, ich machs mal etwas Pseudomäßig...

Code:
Array
 (
  Array ('e1', 'e2', 'e3'),
  Array ('f1', 'f2', 'f3')
 )
=> als CSV, getrennt durch TAB und Zeilenumbruch

Code:
e1   e2   e3
f1   f2   f3
Dies wäre die einfachste Variante.

Delphi-Quellcode:
filecontent := '';

for i := 0 to length (Array) - 1 do
 begin

  for j := 0 to length (Array[i]) - 1 do
   begin
    filecontent := filecontent + Array[i][j];

    if (j + 1 < length (Array[i])) then
     begin
      filecontent := filecontent + #9;
     end;
   end;

  if (i + 1 < length (Array)) then
   begin
    filecontent := filecontent + #13#10;
   end;
 end;

//WriteToFile... (filename, filecontent);
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 16:39
Zeilenweise einlesen (ReadLn oder über eine TStringList) und dann könnte man erstmal die Zeilen zerlegen (manuell oder z.B. über ExplodeExplode) und weist sie dann seinem Record zu.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 18:19
Okay, danke soweit =)

EDIT: Wo kann ich anchlesen wie das mit der Stringlist funktioniert (Strings ausplitten), ich hab hier im Forum nur andere Varianten gefunden.

Wenn die Information in der ersten Zeile 1;1;A;0 beträgt, wie komme ich dann an das 'A' dran?
EDIT: Ich hab es (wahrscheinlich falsch) mit dem Explode von alzaimar probiert und meine 4GB Ram voll ausgelastet...
Delphi-Quellcode:
procedure laden;
var
Datei: TextFile;
Zeile: string;
i, n : integer;
StringList1, sSubStrings : TStringList;
MyDivider: TStringDivider;
MyIterator: TStringDivideIterator;

begin
 StringList1 := TStringList.Create;
 sSubStrings := TStringList.Create;
  try
  StringList1.LoadFromFile(ExtractFilePath(Application.ExeName)+'text.CSV');
  for i := 1 to AnzahlZeilen do
    for n := 1 to AnzahlSpalten do
      begin
        MyDivider := TStringDivider.Create;

        MyDivider.Pattern := ';';
        MyDivider.Explode(StringList1.Strings[i], sSubStrings);

        MyIterator := TStringDivideIterator.Create;
        MyIterator.Pattern := ';';
        MyIterator.Text := StringList1.Strings[i];

        While MyIterator.MoveNext do
         sSubStrings.Add(MyIterator.CurrentStr);
     end;
  finally
    StringList1.Free;
    sSubStrings.Free;
    MyDivider.Free;
    MyIterator.Free;
  end;
end;

Geändert von Dunkelbunt27 ( 7. Apr 2011 um 19:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

Registriert seit: 7. Apr 2011
18 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 22:02
Das ist ganz schön krass was du da zusammen würfelst. Unabhängig davon ob deine Logik funktioniert erzeugst du mit dem Beispiel AnzahlZeilen x AnzahlSpalten Speicherlecks!

Denn du erstellst innerhalb der Schleife jedesmal ein Objekt. Mit nächstem Durchlauf überschreibst du gnadenlos die Referenz. Und nach der Schleife gibst du nur ein Objekt frei?
Und das ganze sogar zweimal...

Setze mal mit dem Anwendungsstart (DPR)

ReportMemoryLeaksOnShutdown := true und lass deine Funktion durchlaufen und beende dein Programm anschließend (wenn dies überhaupt ohne Zugriffsfehler möglich ist).
Wenn du gar nicht begreifst was ich meine dann starte mal deine Funktion 20 mal und schau dir im Taskmanager die Speicherauslastung an.
Und wenn du jetzt sagst, was solls... Speicheranforderungen sind Systemaufrufe und die kosten viel viel Zeit! Und das in einer Schleife?

Und wieso erstellst du die Objekte oberhalb vom try-finally-Block? Und woher willst du im finally-Block wissen, dass alle Objekte auch wirklich existieren?

Was ist deine Zieldatei nicht existiert oder das ganze inmitten der Schleifen abbricht?

Worauf zeigt dann MyIterator? Und worauf die Methode Free ()? Oder anderen Sachen?

Vielleicht geht alles noch beim Lesen der Datei irgendwie gut. Jedoch wenn du auf deinem System irgendwann nur noch halbe Dateien findest solltest du dich nicht wundern.

Du solltest dir eine Funktion explode ('delimiter', 'content') schreiben die möglichst gar keine Objekte verwendet und nichts anderes macht als einen String in Teile zu zerlegen.

Geändert von Trebxson ( 7. Apr 2011 um 23:44 Uhr) Grund: Typo
  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
 
#8

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 23:34
@ASM
danke ...
aber hast Du mal meine und Deine Varianten Debugt? IMHO sind meine die korrekten.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)

Geändert von Bummi ( 8. Apr 2011 um 06:17 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 09:35 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