![]() |
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:
Speichern:
MapPlan: Array of Cardinal;
TexID: Cardinal;
Delphi-Quellcode:
Laden
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;
Delphi-Quellcode:
Wie kann das sein, dass ich ne 0 rauslese wenn ich nie eine reinschreibe ? -.-
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; Gruß Neutral General |
Re: Keine 0 schreiben, aber lesen! o.O
Hast du dir die entstandene Daqtei mal mit einem HexEditor angeguckt?
|
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 ? :|
|
Re: Keine 0 schreiben, aber lesen! o.O
evtl ist es nichts, aber genau deswegen macht IntToStr eine 0 raus?
|
Re: Keine 0 schreiben, aber lesen! o.O
Zitat:
Wäre übrigens das erste gewesen, was ich gemacht hätte, bevor ich hie rim Forum gepostet hätte. :? |
Re: Keine 0 schreiben, aber lesen! o.O
Das einzige, das ich mir vorstellen kann ist, dass beim Lesen was schiefgeht.
Delphi-Quellcode:
Wenn TexID uninitialisiert ist, steht meisstens 0 drinnenstehn.
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; 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: |
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. |
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. |
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 |
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.
|
Re: Keine 0 schreiben, aber lesen! o.O
Ach son Quatsch.. Es liegt wie gesagt nicht am laden. Hab mir schonmal jede einzelne ID ausgeben lassen nach dem laden und keiner war 0. (Gültige ID-Werte sind x*4)
Aber meine Draw Procedure verursacht immer eine AV.
Delphi-Quellcode:
Warum krachts da? Wenn ich Einzelschritte mache oder mir bei jedem/einem beliebigen Schleifendurchlauf ne Message anzeigen lasse dann klappt alles -.- Und vorher hat auch alles geklappt... Die procedure HAT mal geklappt.. und seitdem meine IDs nicht bei 0 anfangen (0,4,8,12,..) sondern bei 4 (4,8,12,...) krachts da irgendwo.. aber ich habe sonst auch alles auf 4 umgestellt. Das ist sicher.
procedure TcfrMapView.Draw(dx,dy: Integer);
var i: Integer; tdx,tdy: Integer; tb,tob: TBitmap; begin with ImgSurface.Picture.Bitmap.Canvas do begin Brush.Color := clblack; Rectangle(-1,-1,Width+1,Height+1); if Length(frmMain.Map.MapPlan) = 0 then exit; // Tiles for i:= 0 to High(frmMain.Map.MapPlan) do begin tdx := ((i mod frmMain.Map.Width)*64)+(-dx*64); tdy := ((i div frmMain.Map.Width)*64)+(-dy*64); if (frmMain.Map.MapPlan[i] <> High(Cardinal)) and (tdx <= imgSurface.Width) and (tdy <= imgSurface.Height) and (tdx >= 0) and (tdy >= 0) then begin tb := TBitmap.Create; tob := TBitmap.Create; tb.Assign(frmMain.Textures[(frmMain.Map.MapPlan[i] div 4)-1].Bitmap); tob.Assign(frmMain.Textures[(frmMain.Map.MapPlan[i] div 4)-1].Overlay); RotateBitmap(tb,(frmMain.Map.MapPlan[i] mod 4)*90); RotateBitmap(tob,(frmMain.Map.MapPlan[i] mod 4)*90); Draw(tdx,tdy,tb); Draw(tdx,tdy,tob); end; end; ... // Unwichtig end; Gruß Neutral General |
Re: Keine 0 schreiben, aber lesen! o.O
Ersetze in deinem Code mal Read und Write durch ReadBuffer und WriteBuffer. Die haben dieselbe Semantik, lösen aber eine Exception aus wenn das Lesen bzw. Schreiben nicht klappt. Dann bist du auf jeden Fall dahingehend auf der sicheren Seite, dass die Ein- und Ausgabe funktioniert.
|
Re: Keine 0 schreiben, aber lesen! o.O
Ich hab herausgefunden woran es liegt -.-^^
Ich habe wenn ich meinen Editor starte keine Textur angewählt gehabt (Die ID mit der gemalt wird = 0) So wenn man jetzt beim Opendialog auf öffnen geklickt hat, ist der Klick durch den Opendialog auf mein Image und hat ausgelöst das die ID meines Pinsels an diese Stelle gesetzt wird => Die 0 wird gesetzt und während meine Procedure noch läd schleicht sich eine 0 is mein Feld und dann will mein Programm malen und *booom* -.-^^ Hab jetzt den Start-Brush auf ID=4 gesetzt.... Aber wieso geht der Klick dadurch? Kann ich irgendwie machen das das nicht so ist ? :| Gruß Neutral General |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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