Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dynamische Array mit Daten aus TFileStream füllen (https://www.delphipraxis.net/94149-dynamische-array-mit-daten-aus-tfilestream-fuellen.html)

Brainstalker 17. Jun 2007 01:02


Dynamische Array mit Daten aus TFileStream füllen
 
Hallo,

ich habe ein kleines Problem beim auslesen einer Datei. Ich hab nur die Struktur der Datei und hab daraus eine klasse geschrieben. Es funktioniert auch fast alles. Nur an einer Stelle hakt es. Ich glaube es hängt mit einem dynamischen Array zusammen.

Code:
TSprImage = record
  width: word;
  height: word;
  compressedlength: word;
  data: array of char;
end;

...

FImages: array of TSprImage;
stream: TFileStream;
length: integer;

...

length := 18;

SetLength(FImages, FHeader.numberofimages);
SetLength(FImages[i].data, length);
stream.Read(FImages[i].data, length);
Wenn ich das auslesen der Daten so über ein dynamisches Array mache funktioniert es nicht. Wenn ich das Array data allerdings statisch mache dann geht es. Was könnte denn der Fehler sein?

Luckie 17. Jun 2007 02:17

Re: Dynamische Array mit Daten aus TFileStream füllen
 
Zitat:

Zitat von Brainstalker
Was könnte denn der Fehler sein?

´
Du schreibst ausserhalb der Arraygrenzen?*

*) Nur geraten, da uns die Fehlermeldung beharrlich verschwiegen wird.

Ghostwalker 17. Jun 2007 04:48

Re: Dynamische Array mit Daten aus TFileStream füllen
 
Probiers mal mit:

Delphi-Quellcode:
  stream.Read(FImages[i].data[b][0][/b], length);
Da ein dynamisches Array nix anderes ist (intern) als ein Zeiger, solltest du dem Compiler schon sagen, das er an die Adresse Schreibt auf die der Zeiger zeigt, nicht an die Adresse des Zeigers. Sonst gibts nämlich eine schöne Exception :)

Brainstalker 17. Jun 2007 10:27

Re: Dynamische Array mit Daten aus TFileStream füllen
 
Wusst ich doch das was Fehlt. Das passiert wenn man Beiträge schreibt obwohl man schon schlafen sollte.
Hier der Fehler:

---------------------------
Project1
---------------------------
Access violation at address 004055F5 in module 'Project1.exe'. Read of address 020201FE.
---------------------------
OK
---------------------------

Scheint also ein Fehler beim lesen zu sein so wie es da steht. Ich werde den Vorschlag mal ausprobieren, scheint ja wirklich so zu sein das es außerhalb des Arrays liegt.

3_of_8 17. Jun 2007 10:29

Re: Dynamische Array mit Daten aus TFileStream füllen
 
Delphi-Quellcode:
stream.Read(FImages[i].data[0], length);
Wie bereits gesagt...

Brainstalker 17. Jun 2007 11:28

Re: Dynamische Array mit Daten aus TFileStream füllen
 
Ok es lag wirklich daran.
Mir stellt sich jetzt bloß eine Frage, warum funktioniert es wenn ich [0] bei statischen Arrays weg lasse. Ist ein statisches Array nicht genauso ein Pointer wie ein dynamisches? Oder liegt es vielleicht daran das bei statischen Arrays bereits der Speicher zum Anfang reserviert wird?

3_of_8 17. Jun 2007 11:37

Re: Dynamische Array mit Daten aus TFileStream füllen
 
Nein. Ein statisches Array liegt irgendwo auf dem Stack und die Variable ist "das Array selbst". Ein dynamisches Array ist ein Pointer auf die Array-Struktur.


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