Delphi-PRAXiS
Seite 1 von 2  1 2      

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/22410-stack-ueberlauf.html)

Christian18 17. Mai 2004 13:55


Stack Überlauf
 
Hallo,

Wenn ich mein Programm starte, dann kommt ein Fehler "Stack Überlauf"

was ist das???

Warum kommt dieser Fehler!!!

shmia 17. Mai 2004 14:11

Re: Stack Überlauf
 
Zitat:

Zitat von Christian18
Wenn ich mein Programm starte, dann kommt ein Fehler "Stack Überlauf"
was ist das???
Warum kommt dieser Fehler!!!

Weil du mit ziemlicher Sicherheit eine endlose Rekursion "eingebastelt" hast.
Beispiel:
Delphi-Quellcode:
function ErzeugeStackOverflow(anzahl:Integer):integer;
begin
   Result := 2 * ErzeugeStackOverflow(anzahl+1);
end;
Dies ist auch über "mehrere Ecken" möglich;
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).

Gandalfus 17. Mai 2004 14:20

Re: Stack Überlauf
 
Oder du hast eine lokale Variable die zu gross wird.

Jens Schumann 17. Mai 2004 14:29

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]

Christian18 17. Mai 2004 14:34

Re: Stack Überlauf
 
Delphi-Quellcode:
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.
hier einmal mein code was habe ich falsch gemacht

Jens Schumann 17. Mai 2004 14:42

Re: Stack Überlauf
 
Hallo,
genau hier liegt der Fehler
Delphi-Quellcode:
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;
Wenn Du Dir die vorangegangen Beiträge genau durch liest wirst Du den Fehler schnell finden.

Christian18 18. Mai 2004 07:09

Re: Stack Überlauf
 
ich kann meinen fehler nicht finden

Zitat:

Zitat von Jens Schumann
Hallo,
genau hier liegt der Fehler
Delphi-Quellcode:
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;
Wenn Du Dir die vorangegangen Beiträge genau durch liest wirst Du den Fehler schnell finden.


teebee 18. Mai 2004 07:34

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:
Zahl := Random(9)+1; // Zahl von 1 bis 9
Gruß, teebee

IngoD7 18. Mai 2004 07:42

Re: Stack Überlauf
 
Welchen Sinn macht es überhaupt, ein Formular anzeigen zu lassen, während es gerade angezeigt wird? :-D

IngoD7 18. Mai 2004 07:51

Re: Stack Überlauf
 
Zitat:

Zitat von teebee
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:
Zahl := Random(9)+1; // Zahl von 1 bis 9
Gruß, teebee

Dann gibt's aber keine Werte < 1 mehr.

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:
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;
So bleiben auch die Werte zwischen 0 und 1 weiterhin möglich.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:57 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz