AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Stack Überlauf

Ein Thema von Christian18 · begonnen am 17. Mai 2004 · letzter Beitrag vom 19. Mai 2004
Antwort Antwort
Seite 1 von 2  1 2      
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#1

Stack Überlauf

  Alt 17. Mai 2004, 13:55
Hallo,

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

was ist das???

Warum kommt dieser Fehler!!!
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#2

Re: Stack Überlauf

  Alt 17. Mai 2004, 14:11
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).
Andreas
  Mit Zitat antworten Zitat
Gandalfus

Registriert seit: 19. Apr 2003
407 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Stack Überlauf

  Alt 17. Mai 2004, 14:20
Oder du hast eine lokale Variable die zu gross wird.
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#4

Re: Stack Überlauf

  Alt 17. Mai 2004, 14:29
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 [/edit]
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#5

Re: Stack Überlauf

  Alt 17. Mai 2004, 14:34
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
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Stack Überlauf

  Alt 17. Mai 2004, 14:42
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#7

Re: Stack Überlauf

  Alt 18. Mai 2004, 07:09
ich kann meinen fehler nicht finden

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.
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#8

Re: Stack Überlauf

  Alt 18. Mai 2004, 07:34
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:Zahl := Random(9)+1; // Zahl von 1 bis 9 Gruß, teebee
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 16. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#9

Re: Stack Überlauf

  Alt 18. Mai 2004, 07:42
Welchen Sinn macht es überhaupt, ein Formular anzeigen zu lassen, während es gerade angezeigt wird?
  Mit Zitat antworten Zitat
IngoD7

Registriert seit: 16. Feb 2004
464 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Stack Überlauf

  Alt 18. Mai 2004, 07:51
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: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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:29 Uhr.
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