Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stack-Überlauf :-( (https://www.delphipraxis.net/76166-stack-ueberlauf.html)

vogael 30. Aug 2006 22:10


Stack-Überlauf :-(
 
Hallo, bei einem kleinen Programm, welches Bubblesorten soll, tritt immer ein Stack-Überlauf auf, wenn eine Liste mit Zufallszahlen oder eine sortierte Liste von 0-x erstellt wird, welche danach sortiert werden soll. Bei einer invertiert sortierten jedoch nicht. Woran liegt das? Hier mal der Quelltext von dem Listen-Erstell-Button :-O also bei case...of 0 und 2 kommt ein Stacküberlauf, 1 geht reibungslos....
sorry für den nicht sehr eleganten Quelltext :-D

Delphi-Quellcode:
lol:=true;
Anzahl:=StrToInt(EdtAnzahl.text);
SetLength(wert,Anzahl);
ListBox1.Clear;ListBox2.clear;
case cbxvorlage.itemindex of
   0:

   begin
   for i:=0 to Anzahl-2 do
       begin
       wert[i]:=i;
       end;
   randomize;
   Zufallszahl:=random(Anzahl);
   wert[anzahl]:=Zufallszahl;
   for i:=0 to Anzahl-1 do
       begin
       if lol=true then
       ListBox1.Items.Add(IntTostr(wert[i]));
       if checkbox1.checked=true then
          begin
          if i>499 then lol:=false;
          end;
       end;
   end;

1:
   begin
   for i:=0 to Anzahl-1 do
   wert[i]:=Anzahl-i;
   for i:=0 to Anzahl-1 do
       begin
       if lol=true then
       ListBox1.Items.Add(IntTostr(wert[i]));
       if checkbox1.checked=true then
          begin
          if i>499 then lol:=false;
          end;
       end;
   end;

2:
   begin
   randomize;
   for i:=1 to anzahl do
   wert[i]:=random(anzahl);
   for i:=0 to Anzahl-1 do
       begin
       if lol=true then
       ListBox1.Items.Add(IntTostr(wert[i]));
       if checkbox1.checked=true then
          begin
          if i>499 then lol:=false;
          end;
       end;

   end;
end;

Muetze1 30. Aug 2006 23:29

Re: Stack-Überlauf :-(
 
1. Schalte mal in den Projektoptionen die Bereichsprüfung mit an und erstell das Projekt neu. Dann beseitige erstmal die dann gemeldeten Bereichsfehler.
2. Wenn er mit einem EStackOverflow anhält in Delphi, dann lass dir mal den "Call-Stack" (STRG-ALT-S) anzeigen und dann verfolg mal in welcher Reihenfolge er immer wieder in die gleiche Procedure und schau mal genau warum bzw. was du anders machen musst.

vogael 2. Sep 2006 16:39

Re: Stack-Überlauf :-(
 
so, also die Quelle des Übels habe ich gefunden, es scheint ein Probolem mit Zufallszahlen zu geben. Wenn ich sowohl bei case 0 oder 2 die Zeile herausnehme, bei der dem Array eine zufällig erstellte Zahl zugewiesen wird, gibt es keinen Stacküberlauf mehr. Ich brauche diese zufälligen Zahlen aber ! :-O
diese Zeilen hier meine ich :

Delphi-Quellcode:
//bei 2:
wert[i]:=random(anzahl);

//bei 0:
wert[anzahl]:=Zufallszahl;
an dem erstellen der Zufallszahl liegt es übrigens nicht, denn bei case 0 wird die Zufallszahl ja vorher erstellt und dann erst in eine Variable gelegt. Dabei gibt es keine Probleme, erst wenn man diese dann in das Array packen möchte...


Hat jemand eine Lösung für das Problem??

achja, das Call-Stack zeigt übrigens gar nichts an....

Khabarakh 2. Sep 2006 16:45

Re: Stack-Überlauf :-(
 
Du setzt die Länge von "wert" auf "Anzahl", greifst nachher aber auf den Index "Anzahl" zu.

vogael 4. Sep 2006 16:12

Re: Stack-Überlauf :-(
 
hey, stimmt ;)
das hilft aber jedoch nur bei dem wo auf wert[anzahl] zugegriffen wird... bei dem anderen muss es noch an etwas Anderem liegen :-O da kommt übriegns mittlerweile, nachdem ich das mit der Anzahl korrigiert hab, kein Stack-überlauf, sondern nur ein "access violation ...."...hmm

Es sieht dort jetzt also so aus:
Delphi-Quellcode:
2:
   begin
   randomize;
   for i:=0 to anzahl-1 do
   wert[i]:=random(anzahl);
   for i:=0 to Anzahl-1 do
       begin
       if lol=true then
       ListBox1.Items.Add(IntTostr(wert[i]));
       if checkbox1.checked=true then
          begin
          if i>499 then lol:=false;
          end;
       end;

Muetze1 4. Sep 2006 20:50

Re: Stack-Überlauf :-(
 
Schalte in den Projektoptionen unter den Compileroptionen die Bereichs- und Überlaufprüfung ein und erstelle dein komplettes Projekt neu. Dann nochmal ausführen und schauen wo es zu Fehler kommt.


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