![]() |
Stack Überlauf
Hallo,
Wenn ich mein Programm starte, dann kommt ein Fehler "Stack Überlauf" was ist das??? Warum kommt dieser Fehler!!! |
Re: Stack Überlauf
Zitat:
Beispiel:
Delphi-Quellcode:
Dies ist auch über "mehrere Ecken" möglich;
function ErzeugeStackOverflow(anzahl:Integer):integer;
begin Result := 2 * ErzeugeStackOverflow(anzahl+1); end; wenn du z.B. im Event OnPaint die Methode Show aufrufst, dann führt das ebenfalls zu einer endlosen Abfolge von Events (bis der Stack überfüllt ist). |
Re: Stack Überlauf
Oder du hast eine lokale Variable die zu gross wird.
|
Re: Stack Überlauf
Hallo,
ein beliebter Fehler ist es auch im OnPaint Event einer Komponente dafür zu sorgen, dass das OnPaint Event der Komponente aufgerufen wird. [edit]mann sollte die Beiträge der Vorgänger doch aufmerksamer lesen bevor man postet :oops: [/edit] |
Re: Stack Überlauf
Delphi-Quellcode:
hier einmal mein code was habe ich falsch gemacht
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls, Gauges; type TForm1 = class(TForm) Label1: TLabel; Label2: TLabel; Edit1: TEdit; Button1: TButton; Gauge1: TGauge; Label3: TLabel; Label4: TLabel; procedure FormShow(Sender: TObject); procedure Button1Click(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; zahl1, zahl2, zahl3, ergebnis, antwort : real; ok, r :integer; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); begin Randomize; zahl1:=Random(10); zahl2:=Random(10); zahl3:=Random(10); if zahl1=0 then FormShow(Sender); if zahl2=0 then FormShow(Sender); if zahl3=0 then FormShow(Sender); Label1.Caption:=FloatToStr(zahl1) + ' = ' + FloatToStr(zahl2) + 'x' + ' - ' +FloatToStr(zahl3); end; procedure TForm1.Button1Click(Sender: TObject); begin antwort:=StrToFloat(Edit1.Text); ergebnis:=(zahl1 + zahl3) / zahl2; ergebnis:=round(ergebnis*10)/10; Label3.Caption:=FloatToStr(ergebnis); if antwort=ergebnis then begin ShowMessage('Richtig !!!'); ok:=ok+1; r:=r+1; Gauge1.Progress:=r; end else begin ShowMessage('False'); r:=r+1; Gauge1.Progress:=r; end; FormShow(Sender); Edit1.Text:=''; Edit1.SetFocus; if Gauge1.Progress=100 then Label4.Caption:='Sie haben ' + IntToStr(ok) + 'von ' + IntToStr(r); end; procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin if shift=[] then begin case key of 27: Close; 13: Button1Click(Sender); end; end; end; end. |
Re: Stack Überlauf
Hallo,
genau hier liegt der Fehler
Delphi-Quellcode:
Wenn Du Dir die vorangegangen Beiträge genau durch liest wirst Du den Fehler schnell finden.
procedure TForm1.FormShow(Sender: TObject);
begin Randomize; zahl1:=Random(10); zahl2:=Random(10); zahl3:=Random(10); if zahl1=0 then FormShow(Sender); if zahl2=0 then FormShow(Sender); if zahl3=0 then FormShow(Sender); Label1.Caption:=FloatToStr(zahl1) + ' = ' + FloatToStr(zahl2) + 'x' + ' - ' +FloatToStr(zahl3); end; |
Re: Stack Überlauf
ich kann meinen fehler nicht finden
Zitat:
|
Re: Stack Überlauf
Du rufst aus FormShow wieder FormShow auf...
Wenn das zu oft passiert, gibt es einen Stack-Überlauf. Wenn Du verhindern willst, dass eine Zahl Null wird, dann rufe Random so auf:
Delphi-Quellcode:
Gruß, teebee
Zahl := Random(9)+1; // Zahl von 1 bis 9
|
Re: Stack Überlauf
Welchen Sinn macht es überhaupt, ein Formular anzeigen zu lassen, während es gerade angezeigt wird? :-D
|
Re: Stack Überlauf
Zitat:
Die Grundidee des neuerlichen FormShow-Aufrufes scheint zu sein, dass einfach die Zufallszahlenauswahl wiederholt werden soll, wenn eine der Zahlen 0 ist?! Das geht so besser:
Code:
So bleiben auch die Werte zwischen 0 und 1 weiterhin möglich.
procedure TForm1.FormShow(Sender: TObject);
begin Randomize; Repeat zahl1:=Random(10); zahl2:=Random(10); zahl3:=Random(10); Until (Zahl1>0) and (Zahl2>0) and (Zahl3>0); Label1.Caption:=FloatToStr(zahl1) + ' = ' + FloatToStr(zahl2) + 'x' + ' - ' +FloatToStr(zahl3); end; |
Re: Stack Überlauf
Zitat:
Wenn alle Fließkommazahlen zwischen 0 und 10 möglich sein sollen, muss man es mit
Delphi-Quellcode:
machen.
Zahl := Random*10;
Gruß, teebee |
Re: Stack Überlauf
Zitat:
:gruebel: Man sollte nicht so schnell über Befehle schreiben, die man ewig lange nicht benutzt hat. :oops: |
Re: Stack Überlauf
:wall:
|
Re: Stack Überlauf
Zitat:
|
Re: Stack Überlauf
Ich hoffte, die Admins würden diesen Beitrag löschen,
da ich etwas schrieb, jedoch schnell die Lösung dafür erkannte, und so merkte, dass meine Frage sinnfrei gewesen wäre. Sonst nichts. -se0man |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:27 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