Autor Beitrag
bh_brain
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 25.03.03 15:08 
Hi,

ich hab mir ne Liste gebaut ala:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
TFeldArt = (frei, zerstoerbar, unzerstoerbar, wasser, start);

  TSpielfeldListe = ^TElement;
  TElement = record
                Art      : TFeldart;
                Bild     : integer;
                Next     : TSpielfeldListe;
                Previous : TSpielfeldListe;
             end;


Diese Liste besteht jetzt aus sagen wir mal 100 Datensätzen. Wie bekomm ich die jetzt in eine Datei gespeichert?
Einfach nur mit write geht doch nicht, oder? Da speichert er doch dann nur den Zeiger ab, der dann beim Laden aber nicht mehr existiert??

Danke
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Di 25.03.03 16:06 
Hallo bh_brain!

Klar geht das mit Write! Write schreibt die Daten auf die ein Pointer zeigt in eine Datei. Ist nur noch die Frage zu klären, ob der Typ TSpielfeldListe = ^TElement;eine festgelegte Größe hat. Wenn ja, kansnt du diesen Record ohne Probleme abspeichern. Wenn nein, musst du zunächst die Größe des Records speichern!

Gruß wulfskin!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 25.03.03 16:21 
Super danke!
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 25.03.03 22:47 
Hi,

also ich hab damit noch so meine Probleme.

Die Liste besteht aus n Elementen. Schreibt Write jetzt nur den Inhalt von Element 1 in die Datei, oder von allen n Elementen? Ich hab das so mal probiert und beim Laden stimmt schon das erste Element nicht mehr und das dritte ist schon inaccessible, obwohl vor 15^2 Elemente in der Liste waren :(

Und hat ein Aufzählungstyp ala
ausblenden Quelltext
1:
TFeldArt = (frei, zerstoerbar, unzerstoerbar, wasser, start);					

eine feste Länge??
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Mi 26.03.03 14:45 
bh_brain hat folgendes geschrieben:
Und hat ein Aufzählungstyp ala
ausblenden Quelltext
1:
TFeldArt = (frei, zerstoerbar, unzerstoerbar, wasser, start);					

eine feste Länge??
Ja , hat er! Nur bei Strings, Arrays und Listen ohne Längenangabe gibt es keine feste Länge!
Wie ist den TElement definiert?

Gruß wulfskin!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 26.03.03 14:56 
Siehe mein erstes Posting.

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  TFeldArt = (frei, zerstoerbar, unzerstoerbar, wasser, start); 

  TSpielfeldListe = ^TElement; 

  TElement = record 
                Art      : TFeldart; 
                Bild     : integer; 
                Next     : TSpielfeldListe; 
                Previous : TSpielfeldListe; 
             end;
wulfskin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1349
Erhaltene Danke: 1

Win XP
D5 Pers (SSL), D2005 Pro, C, C#
BeitragVerfasst: Mi 26.03.03 15:04 
Hallo!

Da habe ich vollkommen übersehen!
Also da Next und Prev eh noch als nächstes in der Liste sind (denke ich zumindest), würde ich die einzelnen Teile des Records selbst speichern:
ausblenden Quelltext
1:
2:
  Write(Art, SizeOf(Art));
  Write(Bild, SizeOf(Bild));
Wenn du jetzt eine ganze Liste speichern möchtest, dann geh diese in einer Schleife durch und speicher nacheinander wie oben beschreiben. Einizger Unterschied: Am Anfang die Anzahl der Elemente abspeichern!

Gruß wulfskin!

_________________
Manche antworten um ihren Beitragszähler zu erhöhen, andere um zu Helfen.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mi 26.03.03 15:05 
Hi.

Wenn du die records abspeichern willst, dann würd ich 'packed record' verwenden. Sonst speicherst du das Record-alignment mit ab. Will heissen zwischen den einzeilnen feldern des records sind lücken, die nicht sein müssen.

Also:
ausblenden Quelltext
1:
TElement = packed record ...					
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 26.03.03 16:04 
Ich hab jetzt aus all meinen Records packed records gemacht. Klappt auch jetzt etwas besser, allerdings speichere ich ne Liste mit 225 Elementen und beim Laden sind es nur noch 210. Woran kann das denn wieder liegen?
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 26.03.03 16:07 
Oh hab die Antwort von Wulfskin übersehen.

Dann probier ich das so mal. Ist alles ein wenig komisch :?
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Mi 26.03.03 22:38 
Hallo bh_brain!

Es ist schlicht Unfug, die Zeiger in einer typisierten Datei mitzuspeichern. Die zeigen beim Einlesen überallhin, nur nicht auf sinnvolle Daten. Vielleicht liegt ja hier der Fehler?

Teile den Record auf!
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
  Tfeld = packed record 
                Art      : TFeldart; 
                Bild     : integer; 
             end; 

  TElement = packed record 
                Feld     : TFeld; 
                Next     : TSpielfeldListe; 
                Previous : TSpielfeldListe; 
             end;


Dazu eine Datei (file of Tfeld), die Liste durchgehen (Laufzeiger) und das Element "feld" speichern. Die Reihenfolge ergibt sich ja aus der Datensatz-Nummer!
Beim Einlesen wird dann die Liste komplett neu aufgebaut.

Diese Methode spart auf der Platte 8 Byte (2 Pointer) pro Datensatz, die sowieso bein Einlesen neu zugewiesen werden müssen.

Gruß

Dietmar Brüggendiek
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Do 27.03.03 10:46 
Hi,

danke für den Tipp.

Ich speicher die nicht in einer typisierten Datei, sondern in einem file of ...
Da hab ich mit noch nen Record gemacht, weil zu der Liste noch andere Infos gespeichert werden müssen, aber das sollte ja für mein Problem egal sein.

Ich werd das nachher mal machen.

Vielen Dank für Eure Hilfe!
Brueggendiek
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 304

Win 98, Win98SE, Win XP Home
D5 Std
BeitragVerfasst: Do 27.03.03 23:17 
Hallo bh_brain!

bh_brain hat folgendes geschrieben:
Ich speicher die nicht in einer typisierten Datei, sondern in einem file of ...


Ein "file of ..." ist doch eine typisierte Datei. Außerdem gibt es noch Textdateien (variable Satzlänge, entweder lesen oder schreiben möglich) und untypisierte Dateien - aber das ist eher File of Char bzw. File of Byte. Außerdem natürlich die Win-Doofen Streams.

Gruß

Dietmar Brüggendiek
bh_brain Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 28.03.03 10:08 
Brueggendiek hat folgendes geschrieben:

Ein "file of ..." ist doch eine typisierte Datei.


Aber bei deinem Vorschlag hast du dann doch auch eine typisierte Datei.

Also ich hab mir jetzt überlegt wie ich das machen werde.
Da ich zu der Liste noch weitere Infos speichern muss, werde ich jetzt zwei Datein draus machen. Die eine speichert die Zusatzinfos und den Namen und Speicherort der anderen Datei mit der Liste und in der werde ich dann die Liste Stück für Stück durchgehen und speichern.

Danke für Eure Hife.