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 2 von 3     12 3      
Benutzerbild von Trebxson
Trebxson

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 17: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.184 Beiträge
 
Delphi 12 Athens
 
#12

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 17: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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 19: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 20:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Trebxson
Trebxson

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 7. Apr 2011, 23: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 ( 8. Apr 2011 um 00: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
 
#15

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 8. Apr 2011, 00: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 07:17 Uhr)
  Mit Zitat antworten Zitat
ASM

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 8. Apr 2011, 17:23
@ASM
IMHO sind meine die korrekten.
Nein sind sie definitiv nicht!!

Du kannst nicht die Fehlerfreiheit einer Codierung dadurch korrekt prüfen und angeblich nachweisen, wenn Du - wie Du es gemacht hast - die relativ komplizierte Struktur eines 2-dimensionalen Arrays an gerade mal einer einzigen Elementposition des Arrays testest.
Das ist nicht eine Frage rein theoretischer Interpretation, sondern vor allem eine der praktischen Prüfung.

Auf den Fehler in Deinem Code bin ich nämlich gerade dadurch aufmerksam geworden, nachdem ich das komplette 2D-Array mit unterschiedlichen Werten gefüllt hatte und dann folgendermaßen vorgegangen bin: zum einen nach programminternem Austausch per Memorystream zwischen zwei formal gleichen Arrayvariablen (A und B), zum anderen nach Abspeicherung des ersten Arrays (A) per Filestream in einem File und anschließenden Einlesen dieses Files per Filestream in das zweite Array (B), wobei sich ergänzend mit einem Hexeditor die im File gespeicherte Information exakt nachprüfen ließ.

Ergebnis:
Mit Deinem originalen Code wurde in beiden Verfahren nur Garbage sichtbar, und außerdem führte es zufallsbedingt an unregelmäßigen Arraypositionen zu Crash wegen Access violation.

Wie Du also zu Deiner jetzigen Verteidigung und Behauptung kommen kannst, ist mir rätselhaft. Vielleicht solltest Du es einmal kontrollieren mit meiner folgenden Erweiterung Deines Beispielcodes zur Anwendung:
Code:
procedure TForm1.Button2Click(Sender: TObject);
var
  a,b:T2DStringArray;
  i:Integer;
  ms:TMemoryStream;
begin
   ms:=TMemoryStream.Create;
   try
   SetLength(a,100,0);
   for I := Low(a) to High(a) do
    begin
       // hier ist im Original (SetLength(a[i],i) schon einmal ein Fehler:
       // bei i=0 wäre das Array a[0,0] an dieser Stelle sonst nur 1-dimensional!,
       // der Versuch einer Belegung führt unweigerlich zum Crash
       // also muss entweder die Länge der zweiten Dimension auf mindestens 1
       // gesetzt werden oder es müsste eine Sicherheitsabfrage auf das Element A[i,0]
       // erfolgen
       SetLength(a[i],i+1);
       a[i][random(i)]:=char(32+1);
   end;
   a[19,5] := 'Haus';
   a[59,2] := 'Dies ist ein Test';
   Save2DArray(a,ms);
   // hierdurch wird unmissverständlich sichtbar,
   // wie verheerend der originale Code sich auswirkt!
   // Da das Array A ja ab hier nicht mehr benötigt wird,
   // darf seine Eliminierung in der folgenden Anzeige der Elemente des Array B
   // keinerlei Folgen haben; ist das so bei Deinem Code ?
   setlength(a,0,0);
   ms.Position := 0;
   Load2DArray(b,ms);
   Showmessage(format('%s'#13#10'%s',[b[19,5], b[59,2]]));
   finally
     ms.Free;
   end;
end;
Was passiert wohl, wenn Du das Ergebnis der entsprechende Anwendung unter Verwendung Deiner Originalunit vergleichst mit der von mir korrigierten Version der Unit ?

Ach ja, und im übrigen stammt der von Dir gepostete Code in seinem Kern eigentlich nicht von Dir (bzw. von einem Thomas Wassermann ?), sondern von einem P.Below aus dem Jahre 2003, der den Code unter dem Titel "Save and load a 2-dimensional dynamic array" in Torry's Delphi Pages veröffentlicht hatte (http://www.swissdelphicenter.ch/torr....php?id=1971); leider ist diese Urheberschaft in Deiner Unit nirgendwo erwähnt. Bei diesem Code ist der von Dir eingebrachte Fehler allerdings nicht relevant, da der Autor das 2D-Array nicht mit einem T2DStringArray, sondern mit einem T2DBooleanArray entworfen hat. Dieser Code wurde in Deiner Unit uReadWrite_2D_Arrays.pas exakt übernommen und allein der Typ des Arrays ohne jede Rücksicht auf notwendige weitere Anpassung ausgetauscht.
  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
 
#17

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 8. Apr 2011, 21:28
Ja, ich war wohl recht müde ....
[delphi]
writer.Write(A[i, x][1], SizeOf(Char) * Length(A[i,x]));

//bzw.

reader.Read(A[i, x][1],SizeOf(Char) * slen);
[delphi]

ist der richtige Code.
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
Maik81ftl

Registriert seit: 31. Mär 2011
Ort: Wahlstedt
26 Beiträge
 
FreePascal / Lazarus
 
#18

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 8. Apr 2011, 23:27
Was gegen, wenn ich den hier mal ein Anstoß einwerfe???

Delphi-Quellcode:
procedure TRegel.SetYear(AValue: TYear);
var
  d, m: integer;
  s: string;
begin
  FYear := AValue;
  FFilename := Format('%s%d.%s', [FPath, FYear.Yaer, FExt+FYear.Benutzer.Name+' '+FYear.Benutzer.Lastname]);
  if FileExists(FFilename) then begin
    // Daten laden
     with TIniFile.Create(FFilename) do try
       for m := 1 to 12 do begin
         for d := 1 to 31 do begin
           s := Format('%.2d-%.2d', [m, d]);
           Items[d, m].HasRegel := ReadString(s, 'HasRegel', 'false');
         end;
       end;
     finally
       Free;
     end;
  end;
end;
sollte sich eigendlich von selbst erklären. must nur die variablen an deines anpassen.
zur not bitte via PN nachfragen.
würde denne in tewa so aussehen.

Code:
[01-05]
HasRegel=1
Stärke=Normal
Schmerz=Keine

[01-06]
HasRegel=1
Stärke=Normal
Schmerz=Keine

[01-07]
HasRegel=1
Stärke=Normal
Schmerz=Keine

[01-08]
HasRegel=1
Stärke=Leicht
Schmerz=Keine
zugegeben. ist ein Programmausschnitt aus meinem Aktuellen Projekt "Mestruationskalender"
Die Definition eine Bibliothek ist bei mir eine *.so

Geändert von Maik81ftl ( 8. Apr 2011 um 23:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 9. Apr 2011, 08:16
Nein, TIniFile ist nicht für viele Daten gedacht, welche sich auch noch oft ändern.

(Begründung siehe anderer Thread)

PS: "HasRegel" schreibt man mit Doppel-S oder mit T.
$2B or not $2B

Geändert von himitsu ( 9. Apr 2011 um 08:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#20

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 9. Apr 2011, 08:49
@himi:
Zitat:
PS: "HasRegel" schreibt man mit Doppel-S oder mit T.
... im Denglisch nicht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 11:37 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