AGB  ·  Datenschutz  ·  Impressum  







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

Stack Overflow

Ein Thema von evilhomer · begonnen am 13. Jun 2008 · letzter Beitrag vom 13. Jun 2008
Antwort Antwort
Seite 1 von 2  1 2      
evilhomer

Registriert seit: 13. Jun 2008
Ort: Würzburg
6 Beiträge
 
#1

Stack Overflow

  Alt 13. Jun 2008, 16:23
Hi!

Ich bin gerade dabei einen Algorithmus zu erstellen, der beliebig viele der ersten Primzahlen rekursiv berechnet. Für mich erscheint der Code logisch, Abbruchbedingungen sind auch definiert, trotzdem beklagt sich Delphi über einen StackOverflow. Der Code sieht folgendermaßen aus:

Delphi-Quellcode:
procedure TForm1.Prim_re(n,i:integer);

begin
if (n < limit) then begin
       if (i<=1) then List2.Items.Add(IntToStr(n))
       else
         if (n mod i) <> 0 then Prim_re(n,i-1);
       end;
  Prim_re(n+1,n);
end;
Die Variable limit ist die Obergrenze, bis zu der Primzahlen gesucht und in der List2 angezeigt werden sollen. n steht für die aktuelle Zahl, die auf Teilbarkeit untersucht wird und i ist sozusagen eine Laufvariable.
An sich ist der Code also nicht allzu schwer zu durchblicken.
Ich hoffe dass irgendjemand mir helfen kann, bzw. weiß wo hier der Fehler liegen könnte?

Gruß und danke im Voraus
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Stack Overflow

  Alt 13. Jun 2008, 16:26
Lass dir mal n und i kontiniurlich anzeigen
Markus Kinzler
  Mit Zitat antworten Zitat
evilhomer

Registriert seit: 13. Jun 2008
Ort: Würzburg
6 Beiträge
 
#3

Re: Stack Overflow

  Alt 13. Jun 2008, 16:28
Okay, wenn ich mir den Stack anschaue, dann zeigt er mir:

TForm1.Prim_re(2,???)
TForm1.Prim_re(3,???)
TForm1.Prim_re(4,???)
TForm1.Prim_re(5,???)

usw...
bloß, wie kommt es dazu?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Stack Overflow

  Alt 13. Jun 2008, 16:31
Nirgends musst du selber machen
Markus Kinzler
  Mit Zitat antworten Zitat
evilhomer

Registriert seit: 13. Jun 2008
Ort: Würzburg
6 Beiträge
 
#5

Re: Stack Overflow

  Alt 13. Jun 2008, 16:36
Gut, wenn ich den erneuten Aufruf

Prim_re(n+1,n); auskommentiere, dann funktioniert es zumindest, aber das liefert mir natürlich nur eine Zahl, nicht die ganze Liste mit 100,200, wie vielen auch immer. Gibt es da einen Weg, die Funktion ohne Error aufzurufen? (Immerhin muss es rekursiv bleiben..)
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.095 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

Re: Stack Overflow

  Alt 13. Jun 2008, 16:47
Hi,

der Code ist sehr eigenartig, hier einmal anders formatiert:

Delphi-Quellcode:
procedure TForm1.Prim_re(n,i:integer);
begin
  if (n < limit) then
  begin
    if (i<=1) then
      List2.Items.Add(IntToStr(n))
    else
    if (n mod i) <> 0 then
      Prim_re(n,i-1);
  end;

  Prim_re(n+1,n);
end;
Ich hoffe, jetzt wird die dein Fehler deutlich. Prim_re(n+1, n) wird IMMER aufgerufen, unabhängig davon, om n < limit.

Mfg
FAlter
Felix Alter
Japanurlaub 2015
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#7

Re: Stack Overflow

  Alt 13. Jun 2008, 16:48
Hi,

ich formatier deinen Quelltext mal etwas um:

Delphi-Quellcode:
procedure TForm1.Prim_re(n,i:integer);
begin
  if (n < limit) then
  begin
    if (i<=1) then
      List2.Items.Add(IntToStr(n))
    else
      if (n mod i) <> 0 then
        Prim_re(n,i-1);
  end;
  Prim_re(n+1,n);
end;
Jetzt siehtst du vielleicht, dass das mit der Abbruchbedingung noch nicht so ganz stimmt:
Egal, mit welchem N/I die Prozedur aufgerufen wird, sie sich ruft zuletzt immer wieder selbst auf.
Also nichts mit "Abbruch" ...

[edit]Upps, roter Kasten?[/edit]
Gruß
Norman
  Mit Zitat antworten Zitat
shmia

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

Re: Stack Overflow

  Alt 13. Jun 2008, 16:49
Ich denke mal, der Fehler ist durch deine schlampige Einrückung entstanden.
Hier dein Code nach Borland Style Guide formatiert:
Delphi-Quellcode:
procedure TForm1.Prim_re(n,i:integer);
begin
  if n < limit then
  begin
    if i <= 1 then
      List2.Items.Add(IntToStr(n))
    else if (n mod i) <> 0 then
      Prim_re(n,i-1);
  end; // <== dieses end kommt zu früh
  Prim_re(n+1,n); // <<== diese Zeile muss VOR das end
end;
Andreas
  Mit Zitat antworten Zitat
evilhomer

Registriert seit: 13. Jun 2008
Ort: Würzburg
6 Beiträge
 
#9

Re: Stack Overflow

  Alt 13. Jun 2008, 16:57
Okay, das Problem hat sich nun erledigt. Der StackOverflow war ja schon beseitigt, und dass die Prozedur sich nur 1mal aufgerufen hat lag am "else if" statt "if"..
Wer den Code mal benötigen sollte, so funktioniert es bei mir:

Delphi-Quellcode:
procedure TForm1.Prim_re(n,i:integer);
var prim:boolean;

begin
  if n < limit then
  begin
    if i = 1 then List2.Items.Add(IntToStr(n));
    if (n mod i) = 0 then Prim_re(n+1,n)
    else Prim_re(n,i-1);
  end;
end;
Danke für eure Hilfe!
  Mit Zitat antworten Zitat
evilhomer

Registriert seit: 13. Jun 2008
Ort: Würzburg
6 Beiträge
 
#10

Re: Stack Overflow

  Alt 13. Jun 2008, 17:12
Sorry, so ganz ist das Problem immer noch nicht vom Tisch ...
Der Code sieht momentan so aus:

Delphi-Quellcode:
procedure TForm1.Prim_re(n,i:integer);
var prim:boolean;

begin
  if n < limit then
  begin
    if i = 1 then List2.Items.Add(IntToStr(n));
    if (n mod i) = 0 then Prim_re(n+1,n)
    else Prim_re(n,i-1);
  end;
end;
Funktioniert auch anscheinend wunderbar, solange man sich auf die Zahlen von 1 bis 293 beschränkt. Alles darüber bringt einen StackOverflow.
Aus irgendeinem Grund sieht der Stack so aus:

TForm1.Prim_re(???,???)
TForm1.Prim_re(293,2147350260)
TForm1.Prim_re(293,266)
TForm1.Prim_re(293,267)
TForm1.Prim_re(293,268)
... usw, usw

Wie kommt es dazu, dass der Speicher auf einmal so spinnt? Kennt sich vllt jemand damit aus?
  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:12 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