Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi E/A Fehler in Dyn. Array (https://www.delphipraxis.net/13650-e-fehler-dyn-array.html)

BungeeBug 23. Dez 2003 10:37


E/A Fehler in Dyn. Array
 
Hi all,

ich habe ein dyn. Array, in dem ich gerne MD5Digests speichern würde. Also hab ich mir eben nen
Delphi-Quellcode:
MyHashArray : Array of MD5Digest;
erstellt. So weit so gut.
Nun habe ich eine Procedure die das Array füllen soll.
Delphi-Quellcode:
// Thread zum hashen
// Proceduren
PROCEDURE TMyHashThread.execute;
VAR
 i : integer;
BEGIN
// Code zum hashen ...
SetLength(MyHashArray,0);
FOR i := 0 TO Form1.ListBox1.Items.Count-1 DO
 BEGIN
  SetLength(MyHashArray,i);
  MyHashArray[i] := MD5File(Copy(Verzeichniss,0,Pos('*',Verzeichniss)-1)+Form1.ListBox1.Items[i]);
 END;
END;
Das geht auch alles bis zu einer beliebigen Anzahl an Einträgen (Zahl ist immer anders). Dann bekomm ich eine Exception vom Kompiler der dann auch Promt alle 4re von sich streckt und nix mehr macht.
Ich weis nur nich was ich flasch mache ...

Zusatzinfo:
Es handelt ich um eine "EAccessViolation".

Bin für jeden Tipp zuhaben :)

Luckie 23. Dez 2003 11:09

Re: E/A Fehler in Dyn. Array
 
Geh die Schleife mal mit F7 durch.

Christian S. 23. Dez 2003 11:14

Re: E/A Fehler in Dyn. Array
 
Hallo!
  1. Du solltest SetLength nur einmal außerhalb der Schleife aufrufen, das ist schneller
  2. Wenn Du "SetLength(myHashArray, i)" machst, dann ist der höchste Index i-1, Du greifst aber auf den Index i zu!
MfG
Peter

//edit: Mutter aller Rechtschreibfehler korrigiert!

BungeeBug 23. Dez 2003 11:43

Re: E/A Fehler in Dyn. Array
 
Wieso alle Komponenten die ich benutze sollten als ersten Index die 0 haben. Was also kein Problem darstellen sollte ...

€dit :

ich habs trotzdem mal probiert und das bringt das ganze gleich zum Absturz -> 'List out of Bound (-1)' Ich die Fehlermeldung was ja auch stimmt ...

Luckie 23. Dez 2003 11:46

Re: E/A Fehler in Dyn. Array
 
Ja, aber dem ist nicht so. Welchen Wert hat i beim ersten Durchlauf? 0. Wie lang wird das Array bei SetLenght(..., i);? 0. Wo fügts du das ertse Element ein? Bei 0. -> Crash!

Da du weißt wie viele Elemente du brauchst, setzte die Länge vor der Schleife, dann kannst du mit i auf die Elemente zugreifen. Das ist erstens performanter und zweites tuts du dir deinem Speicher was Gutes. :wink:

choose 23. Dez 2003 11:47

Re: E/A Fehler in Dyn. Array
 
Hallo BungeeBug,

das ist genau in den beiden Zeilen:
Delphi-Quellcode:
SetLength(MyHashArray,i);
MyHashArray[i] := //...
in Deinem Code der Fall.

Entweder solltest Du
Delphi-Quellcode:
SetLength(MyHashArray, Succ(i));
verwenden oder gleich dem Rat von Peter Lustig folgen und die Länge nur einmalig zu Beginn setzen.

BungeeBug 23. Dez 2003 11:58

Re: E/A Fehler in Dyn. Array
 
Hi,

ich hab die Länge nun gleich gestezt ... und es geht ( oh Wunder )... Danke @ all. Nur stell ich mir nu die Frage wieso ich nich gleich drauf gekommen bin :(


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