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 3 von 3     123   
Maik81ftl

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 9. Apr 2011, 08:20
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.
Deine Begründung in genanten Thread gelesen. und da hab ich mal eine Frage??? Wen zum Teufel kratzen denne Laufzeiten, wenn es auf die nicht in Geringsten ankommt???

wenn ich 'nen Programm schreibe, wo je ns Zählt, denne würde ich auch auf ein anderen Format umsteigen.

@himi:
Zitat:
PS: "HasRegel" schreibt man mit Doppel-S oder mit T.
... im Denglisch nicht.
Jopp da hast du recht.
Die Definition eine Bibliothek ist bei mir eine *.so
  Mit Zitat antworten Zitat
Benutzerbild von Dunkelbunt27
Dunkelbunt27

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 10. Apr 2011, 14:03
Hallo,

könnte mir vielleicht jemand mal eine Speichern und Laden-Prozedur für meine Variablen schreiben?
So komme ich momentan nicht voran...

Delphi-Quellcode:
type
  TBuchstabe = record
                      Zeichen : char;
                      attribut : byte;
                    end;
buchstabe : array of array of TBuchstabe;
Man kann folgendes verwenden:
Delphi-Quellcode:
SetLength(buchstabe,AnzahlZeilen+1,AnzahlSpalten+1);

for i := 1 to AnzahlZeilen do // von 1 starten - nicht ändern!
    for n := 1 to AnzahlSpalten do
    begin
      buchstabe[i,n].Zeichen := ' ';
      buchstabe[i,n].attribut := 0;
    end;
  end;
Diesen Datensatz möchte ich möglichst unkompliziert in eine Datei packen UND auch wieder laden können, also aus den gespeicherten Daten der Datei das buchstaben-Array wieder befüllen.

Ich hoffe jemand kann helfen.

FG Dunkelbunt
  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
 
#23

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 10. Apr 2011, 22:21
Delphi-Quellcode:
type
  TBuchstabe = record
                      Zeichen : char;
                      attribut : byte;
                    end;


TbuchstabenArray = array of array of TBuchstabe;

Procedure SaveTBuchstabenArray(b:TbuchstabenArray;const fn:String);
var
  fs:TFileStream;
  i,x,y:Integer;
begin
  fs:=TFileStream.Create(fn, fmCreate or fmShareDenyWrite);
  try
    x := High(b) + 1;
    y := High(b[0]) + 1;
    fs.Write(x,SizeOf(x));
    fs.Write(y,SizeOf(y));
    for i := low(b) to high(b) do
    fs.Write(b[i][0].Zeichen, y*SizeOf(TBuchstabe));
  finally
    fs.Free;
  end;
end;

Procedure LoadTBuchstabenArray(var b:TbuchstabenArray;const fn:String);
var
  fs:TFileStream;
  i,x,y:Integer;
begin
  fs:=TFileStream.Create(fn, fmOpenRead);
  try
    fs.Read(x,SizeOf(x));
    fs.Read(y,SizeOf(y));
    SetLength(b,x,y);
    for i := low(b) to high(b) do
    fs.Read(b[i][0].Zeichen, y*SizeOf(TBuchstabe));
  finally
    fs.Free;
  end;
end;
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
Benutzerbild von Dunkelbunt27
Dunkelbunt27

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 11. Apr 2011, 15:23
Ich stand ja richtig auf der Leitung...
ich hab es etwas abgeändert, nur zur 'Übersichtlichkeit', da ich mich mit sprechenden Bezeichnungen besser zurecht finde.
Delphi-Quellcode:
type
  TBuchstabe = record
                      Zeichen : char;
                      attribut : byte;
                    end;
var
  buchstabe : array of array of TBuchstabe;

Procedure Speichern(const Dateiname:String);
var
  Datei:TFileStream;
  i,x,y:Integer;
begin
  Datei:=TFileStream.Create(Dateiname, fmCreate or fmShareDenyWrite);
  try
    x := High(buchstabe) + 1;
    y := High(buchstabe[0]) + 1;
    Datei.Write(x,SizeOf(x));
    Datei.Write(y,SizeOf(y));
    for i := low(buchstabe) to high(buchstabe) do
    Datei.Write(buchstabe[i][0].Zeichen, y*SizeOf(TBuchstabe));
  finally
    Datei.Free;
  end;
end;

Procedure Laden(const Dateiname:String);
var
  Datei: TFileStream;
  i,x,y: Integer;
begin
  Datei:=TFileStream.Create(Dateiname, fmOpenRead);
  try
    Datei.Read(x,SizeOf(x));
    Datei.Read(y,SizeOf(y));
    SetLength(buchstabe,x,y);
    for i := low(buchstabe) to high(buchstabe) do
    Datei.Read(buchstabe[i][0].Zeichen, y*SizeOf(TBuchstabe));
  finally
    Datei.Free;
  end;
end;

Vielen Dank für eure Arbeit!
FG Dunkelbunt
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 11. Apr 2011, 15:44
Wenn das Array leer ist, bekommst Du Probleme beim Speichern, da Du in der ersten Dimension auf das erste Element zugreifst, ohne es auf Existenz zu prüfen. Beim Lesen hast Du das selbe Problem bei einer leeren Datei. Und statt
Zitat:
x := High(buchstabe) + 1;
würde ich eher
x := Length(buchstabe); schreiben.
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 himitsu
himitsu

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 11. Apr 2011, 15:54
Wenn das Array leer ist, bekommst Du Probleme beim Speichern, da Du in der ersten Dimension auf das erste Element zugreifst, ohne es auf Existenz zu prüfen. Beim Lesen hast Du das selbe Problem bei einer leeren Datei. Und statt
Zitat:
x := High(buchstabe) + 1;
würde ich eher
x := Length(buchstabe); schreiben.
Das macht eigentlich keinen unterschied, da es equivalent ist, denn die Funktion High ist so definiert
Delphi-Quellcode:
function High(const a: TMyArray): integer;
begin
  Result := Length(a) - 1;
end;
Bei statischen Arrays wird es ebenso im Compiler ausgerechnet und dann direkt verwendet.


Aber natürlichst speicherst/liest du immer nur den ersten Wert aller SubArrays (egal ob sie existieren oder nicht) und alle weiteren Daten der Subarrays werden ignoriert,
also für x = 1 bis Ende (buchstabe[i][x] )
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (11. Apr 2011 um 15:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 11. Apr 2011, 15:59
Dass das bei dynamischen Arrays keinen Unterschied macht, weiß ich auch. Aber erstens ist das so verständlicher, da es ja um die Länge geht und zweitens sollte man sich das gleich richtig angewöhnen, sonst bekommt man bei statischen Arrays, die nicht 0-indiziert sind, später Probleme.
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
 
#28

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 11. Apr 2011, 17:01
Zitat:
Aber erstens ist das so verständlicher, da es ja um die Länge geht und zweitens sollte man sich das gleich richtig angewöhnen, sonst bekommt man bei statischen Arrays, die nicht 0-indiziert sind, später Probleme.
Das ist ein guter Einwand, ich persönlich finde es so verständlicher.

Wo wir gerade beim Thema sind, könnte mir jemand mal diese Zeile erklären:
Zitat:
Datei.Read(buchstabe[i][0].Zeichen, y*SizeOf(TBuchstabe));
TBuchstabe ist ja ein Typ (Record aus Zeichen, Attribut) was liefert denn SizeOf(TBuchstabe) zurück?
X ist die Länge in beide dimensionen, oder wird automatisch nur die x Dimension genommen?
Y ist dann die Länge für die Y Dimension, wenn X=0, richtig?

Ich versteh nicht ganz wo die Attribute und Zeichen gespeichert werden.

FG Dunkelbunt

Geändert von Dunkelbunt27 (11. Apr 2011 um 17:05 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
 
#29

AW: Mehrdimensionales, dynamisches Array speichern

  Alt 11. Apr 2011, 22:29
Der Record wird als ganzes gespeichert, dies geht bei allen Recordstrukturen die nur aus Elementen einer "fixen Größe" bestehen als z.B. String[33] statt String beinhalten.
SizeOf liefert bei Deiner Definition 4 Byte bei der Definition
Delphi-Quellcode:
  TBuchstabe = packed record
                      Zeichen : char;
                      attribut : byte;
                    end;
3 Byte ....aehaem, ab 2009 da dort Char=2Byte
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
Antwort Antwort
Seite 3 von 3     123   


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 21:31 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