Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - dynamische Arrays : verschiedene Fehlermeldungen ....


elduchte - Do 26.06.03 11:12
Titel: dynamische Arrays : verschiedene Fehlermeldungen ....
Hallo,
ich habe folgendes Programm geschrieben:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
var
   anzahl : integer;
   i      : integer;
   wert   : integer;
   gr_Wert: integer;
   kl_Wert: integer;
   Felder : array of integer;
begin
     anzahl := 0;
     kl_Wert := 0;
     gr_Wert := 0;
     randomize;
     anzahl := StrToInt(Edit1.Text);
     SetLength(Felder, anzahl);
     for i := 1 to Anzahl do
         begin
         wert := random(100);
         Felder[i] := wert;
         end;
     for i := 1 to Anzahl do
         begin
         gr_Wert := MaxIntValue(Felder);
         kl_Wert := MinIntValue(Felder);
         end;
     Edit2.Text := IntToStr(gr_Wert);
     Edit3.Text := IntToStr(kl_Wert);
end;


Nach Start des Programms gebe ich die Anzahl der zu erzeugenden Zufallszahlen ein, die in einem dynamischen Array abgelegt werden sollen. Manchmal habe ich da schon beim Start eine Fehlermeldung der Klasse EAccessViolation: Habe auch schon nachgelesen, was diese Fehlermeldung bedeutet, allerdings kann ich damit immer noch keinen Fehler herausfinden.

Zur nächsten Fehlermeldung:
Gebe ich zB als Anzahl 30 ein, bekomme ich eine Fehlermeldung: Zugriffsverletzung und dann viele Speicheradressen.

Gebe ich als Anzahl 10 ein, berechnet er mir, so wie ich es mir vorstelle, klicke ich dann allerdings auf den Schließen-Button, bekomme ich eine Fehlermeldung, dass ich einen Pointer nicht richtig benutze.

Was mache ich mit meinen dynamischen Arrays falsch ??

ein verzweifelter
Andreas


Keldorn - Do 26.06.03 11:15

Hallo

Zitat:

for i := 1 to Anzahl do
begin
wert := random(100);
Felder[i] := wert;
end;

dyn. array beginnen bei 0 und der letzte Index ist dann anzahl-1

probiers mal so

Delphi-Quelltext
1:
2:
3:
4:
5:
     for i := 0 to Anzahl-1 do 
         begin 
         wert := random(100); 
         Felder[i] := wert; 
         end;


warum setzt Du maxintvalue auch noch in eine Schleife?

Mfg Frank


elduchte - Do 26.06.03 11:43

AHHHH, stimmt ja, jetzt habe ich zumindestens keine Fehlermeldung mehr...

Die zweite Schleife war nur ein Versuch, habe gedacht, so finde ich den Fehler besser (einfacher). Habe die beiden Funktionen schon wieder umkopiert.

Wie kann ich alle Array-Felder löschen, wenn ich z.B. das Programm ein zweites Mal furchlaufen möchte ? Er behält nämlich die Werte solange gespeichert, bis ich das Programm beende.... Gibt es da sowas wie eine Initialisierung?

Gruß
Andreas


BeniSchindler - Do 26.06.03 12:41

Wenn du die selbe Procedur einfach nochmal aufrufst, dann müsste er eigentlich deine alten Werte überschreiben. Du kannst jedoch am anfang der Prozedure die Zeile schreiben:


Delphi-Quelltext
1:
SetLength(Felder, 0);                    


Nach dem der Integer kein Objekt ist, kannst du ihn leider auch nicht Freigeben. Bei einem Array of TObject würde man das ganze so lösen:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Procedure ClearArray(var  TheArray : array of TObject );
var index :integer;
begin
  for index := 0 to high(TheArray) do TheArray[Index].Free;
  SetLength(TheArray,0
end;