![]() |
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:19 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