Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Keine 0 schreiben, aber lesen! o.O (https://www.delphipraxis.net/76649-keine-0-schreiben-aber-lesen-o-o.html)

Neutral General 7. Sep 2006 14:25


Keine 0 schreiben, aber lesen! o.O
 
Hi,

Ich speichere ein paar Daten mit Hilfe eines Streams ab.
Map.MapPlan[x] bzw TexID dürfen nie 0 sein!

Delphi-Quellcode:
MapPlan: Array of Cardinal;
TexID: Cardinal;
Speichern:

Delphi-Quellcode:
for i:= 0 to High(Map.MapPlan) do
begin
 if Map.MapPlan[i] = 0 then ShowMessage(IntToStr(i)); // Wird nie angezeigt => Keine 0 dabei
 Stream.Write(Map.MapPlan[i],SizeOf(Cardinal));
 ...
end;
Laden

Delphi-Quellcode:
for i:= 0 to High(Map.MapPlan) do
begin
  Stream.Read(TexID,SizeOf(Cardinal));
  if TexID = 0 then ShowMessage(IntToStr(i)); // BAAM Es wird ne 0 gelesen o.O
  ...
end;
Wie kann das sein, dass ich ne 0 rauslese wenn ich nie eine reinschreibe ? -.-

Gruß
Neutral General

Luckie 7. Sep 2006 14:29

Re: Keine 0 schreiben, aber lesen! o.O
 
Hast du dir die entstandene Daqtei mal mit einem HexEditor angeguckt?

Neutral General 7. Sep 2006 14:31

Re: Keine 0 schreiben, aber lesen! o.O
 
Nein noch nicht aber ich meine wenn mein ShowMessage nicht anspringt, wieso sollte er denn eine reinschreiben ? :|

vlees91 7. Sep 2006 14:48

Re: Keine 0 schreiben, aber lesen! o.O
 
evtl ist es nichts, aber genau deswegen macht IntToStr eine 0 raus?

Luckie 7. Sep 2006 14:54

Re: Keine 0 schreiben, aber lesen! o.O
 
Zitat:

Zitat von Neutral General
Nein noch nicht aber ich meine wenn mein ShowMessage nicht anspringt, wieso sollte er denn eine reinschreiben ? :|

Genau das sollst du ja feststellen, in dem du die Datei mal anguckst, ob da wirklich das drinne steht, was du meinst reinzuschreiben.

Wäre übrigens das erste gewesen, was ich gemacht hätte, bevor ich hie rim Forum gepostet hätte. :?

JasonDX 7. Sep 2006 15:02

Re: Keine 0 schreiben, aber lesen! o.O
 
Das einzige, das ich mir vorstellen kann ist, dass beim Lesen was schiefgeht.
Delphi-Quellcode:
for i:= 0 to High(Map.MapPlan) do
begin
  Stream.Read(TexID,SizeOf(Cardinal));
  if TexID = 0 then ShowMessage(IntToStr(i)); // BAAM Es wird ne 0 gelesen o.O
  ...
end;
Wenn TexID uninitialisiert ist, steht meisstens 0 drinnenstehn.
Es kann gut sein, dass du was in den Stream reinschreibst, und es dann gleich wieder auslesen willst - ohne die Position auf 0 zu setzen. D.h. er steht am Ende des Streams, damit liest er 0 Bytes aus dem Stream, schreibt 0 Bytes in die Variable TexID rein und es bleibt die 0 darin uebrig.
Deswegen wuerde ich auch generell immer mitzaehlen, wieviele Bytes in den Stream geschrieben und gelesen wurden. Die Anzahl der gelesenen/gerschrieben Bytes steht uebrigens im Ergebnis von Read und Write.

greetz
Mike

PS: Ein Blick in die Datei zeigt eigentlich immer die Problemstelle auf, und erspart uns Spekulationen ueber evt. Fehlerursachen :zwinker:

3_of_8 7. Sep 2006 15:02

Re: Keine 0 schreiben, aber lesen! o.O
 
Er hat mir seinen Code per ICQ geschickt, und ich glaub ich weiß, was das Problem ist:

Er bastelt sich nen MemoryStream und macht LoadFromFile. Dadurch steht die Position am Ende des Streams und wenn er jetzt ließt, kriegt er nur lauter Nullbytes.

Christian Seehase 7. Sep 2006 15:10

Re: Keine 0 schreiben, aber lesen! o.O
 
Moin Michael,

Dein Code lässt nicht erkennen, ob Du den Stream vor dem Einlesen geschlossen und wieder geöffnet hast.
Wenn nicht, solltest Du vor dem Auslesen mal Position auf 0 setzen (vor dem Schreiben natürlich auch).
Sonst sprichst Du die falschen Stellen an.

Neutral General 7. Sep 2006 17:24

Re: Keine 0 schreiben, aber lesen! o.O
 
Ehm es sind zwei verschiedene Proceduren und Stream ist eine lokale Variable vom Typ TMemoryStream, die in beiden Funktionen benutzt wird. Und der Code wird auch nicht hintereinander ausgeführt.. Der eine halt wenn man eine Map laden will und der andere wenn man sie speichern will ;)

EDIT: Jedoch fällt mir grad auf das der Fehler gar nicht in einer der beiden procedure auftaucht -.-
Ich hab soviele ShowMessages zum Debuggen benutzt, das ich nicht gemerkt hab das die AV (und auch die 0en) erst in der
Draw-Methode der Map erzeugt werden -.-^^

Gruß
Neutral General

3_of_8 7. Sep 2006 17:27

Re: Keine 0 schreiben, aber lesen! o.O
 
Ich denke mal, dass LoadFromFile auch den Positionszeiger nach ganz hinten setzt. Also einfach mal Position:=0 machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:00 Uhr.
Seite 1 von 2  1 2      

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