Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi beschränkte Array-Länge ? (https://www.delphipraxis.net/17444-beschraenkte-array-laenge.html)

Schneider-Huetter 5. Mär 2004 17:47


beschränkte Array-Länge ?
 
Hallo zusammen,
ich schreibe gerade ein Programm, das eine Datei binär einliest und dann byte-weise in ein Array schreibt (bzw. sollte). Das klappt soweit auch ganz gut, nur wenn ich eine bestimmte Dateigröße überschreite erhalte ich eine Stack-Overflow Meldung. Meine Testdatei ist 1.048.576 Bytes (genau ein MByte) groß, d.h. mein Array müsste 1.048.576 Felder besitzen, da in jedes genau ein Byte kommt. Doch anscheinend ist die Anzahl der Felder zu groß. Weiß jemand wie viele Felder man maximal erstellen kann und/oder wie man diese Größenbeschränkung umgehen kann?

Im Voraus schon mal Danke für eure Antworten

Christian Seehase 5. Mär 2004 18:47

Re: beschränkte Array-Länge ?
 
Moin Schneider-Huetter,

erst einmal herzlich willkommen hier in der Delphi-PRAXiS.

Dein Problem kann ich nicht nachvollziehen.
Zum Testen hab' ich eben in ein dynamische array of byte eine 6 MB grosse Datei eingelesen, und das hat, erwartungsgemäss, problemlos funktioniert.

Ein wenig Sourcecode, wie Du die Daten einliest wäre hilfreich.

LarsMiddendorf 5. Mär 2004 18:51

Re: beschränkte Array-Länge ?
 
Entweder du verwendest ein dynamisches Array oder du speicherst das Array nicht als lokale Variable, sondern global oder als Attribut in einem Objekt.

Schneider-Huetter 5. Mär 2004 19:25

Re: beschränkte Array-Länge ?
 
Danke erst mal für die nette Begrüßung und eure Antworten.

Hier kommt der Quelltext, in dem ich die Datei einlese:

Delphi-Quellcode:
Procedure RomEinlesen(Datei: String);

type
  TDatenBytes = array[0..1048576] of Byte;

var
  DatenBytes: TDatenBytes;
  i: Integer;                
  DateiGr: Integer;

begin
  DateiGr:=FileSize(Datei);
  Form1.Edit1.Text:=IntToStr(DateiGr);

  with TFileStream.Create(Datei, fmOpenRead) do
  try
    Read(DatenBytes, SizeOf(DatenBytes));
   finally
    Free;
  end;

  //Die gelesenen Bytes zur Kontrolle in einer ListBox ausgeben
  for i:=0 to 1048576 do
  Form1.ListBox1.AddItem(IntToStr(DatenBytes[i]),nil);

end;
Ich hab hier mal ein statisches Array benutzt, aber auch wenn ich ein dynamisches verwende erhalte ich einen Laufzeitfehler (aber keinen Stapel-Überlauf)

LarsMiddendorf 5. Mär 2004 19:44

Re: beschränkte Array-Länge ?
 
Bei einem dynamischen Array muß man das erste Element und nicht das Array selber übergeben. Falls du ein dynamisches Array benutzt geht es so besser:
Delphi-Quellcode:
Read(DatenBytes[0], Length(DatenBytes));
Da das statische Array als lokale Varialbe deklariert ist, belegt es Speicher auf dem Stack. Wenn man die Deklaration vor die procedure schreibt wird der Speicher im Datensegment belegt und die Begrenzung gilt nicht mehr.

Delphi-Quellcode:
type
  TDatenBytes = array[0..1048576] of Byte;

var
  DatenBytes: TDatenBytes;

Procedure RomEinlesen(Datei: String);
...
...

Schneider-Huetter 6. Mär 2004 11:25

Re: beschränkte Array-Länge ?
 
Vielen Dank LarsMiddendorf,
jetzt funktionierts prinzipziell einwandfrei, nur dauert das Einlesen eine halbe Ewigkeit. Kann man das Einlesen ins Array zu beschleunigen oder gibt es eine andere Möglichkeit, mein Problem zu lösen? Die Datei müsste eigentlich gar nicht in einem Array gespeichert sein, es muss lediglich ein (möglichst schneller) Zugriff auf ein beliebiges Byte in der Datei möglich sein.

Christian Seehase 6. Mär 2004 12:07

Re: beschränkte Array-Länge ?
 
Moin Schneider-Huetter,

dann nimm doch als Buffer einfach einen String, und lies die Datei in einem Stück ein.
Die Ausgabe in der Listbox dürfte allerdings das eigentliche Geschindigkeitsproblem darstellen.

Schneider-Huetter 6. Mär 2004 13:21

Re: beschränkte Array-Länge ?
 
Du hast völlig recht, es liegt tatsächlich nur an der ListBox-Ausgabe. Das mit dem String ist eigentlich wirklich die bessere Lösung.
Vielen Dank!


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