Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi AV bei MemoryStream (https://www.delphipraxis.net/72608-av-bei-memorystream.html)

3_of_8 3. Jul 2006 20:16


AV bei MemoryStream
 
Morgen.

Ich habe hier gerade folgendes nerviges Problem:

Ich lese aus einem FileStream und schreibe die Daten in einen MemoryStream:

Delphi-Quellcode:
procedure TTiles.LoadFromFile(FileName: String);
var fs: TFileStream;
    memstr: TMemoryStream;
    size: Cardinal;
    buf: array of Byte;
    tgaimg: TTarga;
begin
  imglst.Items.Clear;
  fs:=TFileStream.Create(FileName, fmOpenRead);
  memstr:=TMemoryStream.Create;
  tgaimg:=TTarga.Create;
  try
    fs.Read(FTileWidth, sizeof(Cardinal));
    fs.Read(FTileHeight, sizeof(Cardinal));
    while fs.Position<fs.Size do
    begin
      fs.Read(size, sizeof(Cardinal));
      setlength(buf, size);
      fs.Read(buf, size);
      memstr.Write(buf, size);
      tgaimg.LoadFromStream(memstr);
      memstr.Clear;
      tgaimg.SaveToStream(memstr);
      with imglst.Items.Items[imglst.Items.Add.Index].Picture do
      begin
      Bitmap:=TBitmap.Create;
      Bitmap.LoadFromStream(memstr);
      end;
      memstr.Clear;
    end;
    setlength(buf, 0);
  finally
    fs.free;
    memstr.free;
    tgaimg.free;
  end;
end;
Bei memstr.write (Hier Zeile 19) erhalte ich eine AV. Woran könnte das liegen?

Christian Seehase 3. Jul 2006 20:20

Re: AV bei MemoryStream
 
Moin Manuel,

weil Du bei Arrays auch immer den Index mit angeben musst:

Delphi-Quellcode:
memstr.Write(buf[0], size);
ansonsten überschreibst Du das, was hinter dem Pointer steht, der die Adresse von Buf enthält, und nicht den Buffer.

3_of_8 3. Jul 2006 20:21

Re: AV bei MemoryStream
 
:wall:

Ich bin doch auch so dumm...

Matze 3. Jul 2006 20:24

Re: AV bei MemoryStream
 
Nur mal so als Tipp für die Zukunft, um deine Programme besser zu machen: Verwende Resourcen-Schutzblöcke (try - finally, in deinem Fall, 3 Mal *g*). Dein Code ist ja schlimm. :stupid:

3_of_8 3. Jul 2006 20:41

Re: AV bei MemoryStream
 
Jaa, ich weiß. Mach ich normalerweise auch. Und das kommt auch später noch rein. Ich bin doch kein Anfänger. OK, ich bin ein Anfänger, aber kein blutiger. Jedenfalls kein blutverschmierter.

Matze 3. Jul 2006 20:48

Re: AV bei MemoryStream
 
Zitat:

Zitat von 3_of_8
Ich bin doch kein Anfänger. OK, ich bin ein Anfänger, aber kein blutiger. Jedenfalls kein blutverschmierter.

Ich weiß, dann sei doch Anfängern hier vorbild und stelle hier sauberen Code hinein, sonst gucken manche sich das ab und das wäre nicht so gut. Darum habe ich das u.a. auch erwähnt. Aber nun gut, Thema beendet.

3_of_8 3. Jul 2006 22:30

Re: AV bei MemoryStream
 
Ich meinte das eigentlich ernst. Ich bin ein Anfänger. Kein Totalanfänger, aber immer noch ein Anfänger.

Luckie 3. Jul 2006 22:35

Re: AV bei MemoryStream
 
Aber wenn du es weißt, dass es fehlt, warum machst du es denn nicht gleich richtig? Dann kannst du es im Nachhinein auch nicht vergessen und hie rim Forum steht richtiger Code.

3_of_8 3. Jul 2006 22:47

Re: AV bei MemoryStream
 
:roll:

Na gut, ich ändere es schnell. Es war eine kleine Frage und ich dachte, ich müsste den Code nicht extra vorher aufbereiten. Ich werde nächstes mal schön überall try-excepts hinsetzen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:53 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