Randomize funktioniert nicht

Wer kann mir helfen? Ich will n (vorerst 10) zufälige Zahlen in einer ListBox ausgeben. Wenn ich aber ‚Randomize‘ aufrufe stürzt mir das Programm jedes mal ab und meckert von einer Zugriffsverletzung. Lasse ich ‚Randomize‘ weg funktioniert das Programm zwar, aber ich bekomm (logischerweise) jedes Mal die selben Zahlen, drücke ich dann ein weiteres Mal auf den Button, bekomm ich dann wieder eine Fehlermeldung!
Hab noch den Code rüberkopiert, in der Hoffnung, dass mir jemand helfen kann!
Ich dank euch schon mal für eure Hilfe!

procedure TForm1.Button1Click(Sender: TObject);
var Feld : array[1…10] of integer;
counter : integer;

begin;
randomize;
For counter :=0 to 10 do Feld[counter] := Random(1000);
Form1.ListBox1.Items.Clear;
for counter :=0 to 10 do Form1.ListBox1.Items.Add(IntToStr(Feld[counter]));
end;

Hi Jenny,

es liegt nicht an der „Randomize“-Funktion. Versuch mal, die Antwort auf die Frage zu finden, wieviele Elemente jeweils die vier mit diesen Zeilen deklarierten Felder beinhalten:

a) var Feld1 : array[1…10] of integer;
b) var Feld2 : array[0…10] of integer;
c) var Feld3 : array[1…9] of integer;
d) var Feld4 : array[0…9] of integer;

Allgemeiner Tip: Wenn Du irgendwas mit n Zahlen machen willst, dann wähle als Grenzen für alle Arrays und FOR-Schleifen und dergleichen niemals 1 und n, sondern immer 0 und n–1.

Den/die Fehler in Deinem Programm solltest Du nun slebst finden können.

Mit freundlichem Gruß
Martin

Hi Martin!

Erst einmal ein Supegrosses Danke!
Das ich auch immer so BLÖDE fehler haben muss!
Aber eine Frage hätt ich da noch: Wieso funktioniert das nicht, wenn ich
Array[1…10]
Array[1…11]
Array[1…9]
schreibe? Beim zweiten Fall habe ich ja auch ein Feld mit zehn Elementen!

Ciao Jenny

Nochmals Hi!

Aber eine Frage hätt ich da noch: Wieso funktioniert das
nicht, wenn ich
Array[1…10]
Array[1…11]
Array[1…9]
schreibe? Beim zweiten Fall habe ich ja auch ein Feld mit zehn
Elementen!

Nein, Jenny, das Feld „Array[1…11]“ hat nicht zehn Elemente! Bitte denk noch mal nach und korrigiere Dich dann selbst. Die Sache mit den Elementanzahlen sollte Dir ganz klar sein, weil das im Programmiereralltag an allen Ecken und Enden vorkommt.

Dein Programm funktioniert auch z. B. mit „Array[1…10]“, nur müssen die Grenzen Deines FOR-Zählers dann 1 und 10 sein; genausogut funktioniert „Array[265…274]“ mit „FOR i := 265 TO 274 DO…“. Was nicht geht, ist, wenn Deine Zählvariable i Werte annimmt, die außerhalb der Arraygrenzen liegen. Genau das passiert aber in Deinem Programm:

var Feld : array[1..10] of integer;
counter : integer;
begin;
 ...
 For counter :=0 to 10 do 
 Feld[counter] := ...;
 ...

Die untere Grenze des „Feld“-Arrays ist Eins , aber „counter“ läuft von Null ab hoch. In dem Moment, in dem der Compiler was mit „Feld[0]“ anstellen soll, erscheint die Fehlermeldung, denn „Feld[0]“ gibt es ja gar nicht.

Ich rate Dir nochmal dringend, ein Feld mit n Elementen stets als „ARRAY[0…n–1] OF Wasauchimmer“ zu deklarieren. Das ist so eine Art Konvention, an der sich alle (guten) Programmierer halten. Delphi selbst übrigens auch – z. B. stehen die n=Listbox1.Count Elemente der „ListBox1“ in Items[0] bis Items[n-1], nicht in Items[1] bis Items[n]. Der Grund für die Konvention „0 bis n–1“ ist übrigens, daß Computer quasi von Haus aus immer von Null anfangen zu zählen.

Nun sollte Dir klar sein, wie Du Dein Programm gestalten mußt, wenn Du Dich an die Konvention halten willst:

procedure TForm1.Button1Click(Sender: TObject);
var Feld : array[0..9] of integer;
counter : integer;
begin;
 randomize;
 For counter :=0 to 9 do 
 Feld[counter] := Random(1000);
 Form1.ListBox1.Items.Clear;
 for counter :=0 to 9 do 
 Form1.ListBox1.Items.Add(IntToStr(Feld[counter]));
end;

Auch wenn es mit der „9“ vielleicht auf den ersten Blick etwas komisch aussehen mag: Du gewöhnst Dich schnell daran :wink:.

Mit freundlichem Gruß
Martin

OK, ich hab nicht genau nachgedacht, klar dass ein Array mit den Grenzen 1 und 11 elf Elemente hat. Ich muss dazu sagen, dass meine Konzentration heute auch nicht die besste ist, vor allem wenn ich überlege, dass ich das mit der unteren Grenze 0 auch so gelernt hatte! Also Entschuldigung erst einmal! Werd jetzt aber ersteinmal weiter machen und hoffen, dass sich die Fehlermeldungen von mir fern halten werden :smile:

MfG Jenny

OK, ich hab nicht genau nachgedacht, klar dass ein Array mit
den Grenzen 1 und 11 elf Elemente hat.

All right :smile:. Vielleicht aber doch noch eine Anmerkung: Das, was in Deinem alten Programm den Fehler verursacht hat, heißt „Bereichsüberschreitung“. Wenn eine solche auftritt, meldet der Compiler aber nur dann einen Fehler, wenn das „Range checking“ aktiviert ist. Du findest die betreffende Checkbox unter dem Menüpunkt „Projekt/Optionen“ –> Registerkarte „Compiler“ –> Box „Laufzeitfehler“ rechts oben.

Wenn eine Bereichsüberschreitung bei de aktiviertem range checking auftritt, kommt keine Fehlermeldung, sondern Dein Programm kann sich nach allen Regeln der Kunst aufhängen.

Solange Du an einem Programm arbeitest, sollte das „range checking“ immer eingeschaltet sein. Wenn Du nach Fertigstellung eine Produktversion compilierst (und Du sicher bist, daß keine Bereichsüberschreitung auftreten kann), solltest Du es aber ausschalten. Der Compiler muß für das range checking nämlich eine Menge zusätzlichen Code generieren, der die EXE-Datei aufbläht und Dein Programm verlangsamt.

Na dann, fröhliches Schaffen noch!

Grüße
Martin