Recursion level has been exceeded - AutoIt will quit to prevent stack overflow.

01/19/2013 14:17 iZz0s#1
Hallo Leute,

ich hab das folgende Problem mit meinem Bot:

Nach ca. 4-5 Std. Laufzeit meines Bots bekomme ich folgende Meldung...

"Recursion level has been exceeded - AutoIt will quit to prevent stack overflow."

Das ganze an völlig unterschiedlichen Stellen, es ist also wirklich die Addition die das Problem hervorruft und nicht eine bestimmte Funktion etc.

Ich hab bereits viel gelesen, viel gegoogelt und herausgefunden das es mit den Funktionen zutun hat - das diese immer weiter verschachtelt werden. Hier solle man evtl. weniger mit Funktionen, besser mehr mit Schleifen arbeiten.

Meine Funktionen sind wie folgt aufgebaut:

Code:
Func func_1()
   while 1
      if (irgendwas = true) then
         mach_was
         func_2()
         ExitLoop
      EndIf
EndFunc

Func func_2()
   while 1
      if (irgendwas = true) then
         mach_was
         func_3()
         ExitLoop
      EndIf
EndFunc

Func func_3()
   while 1
      if (irgendwas = true) then
         mach_was
         func_1()
         ExitLoop
      EndIf
EndFunc
Es ist also nicht so, das ich in einer Funktion die gleiche Funktion noch mal aufrufe - was ja gerne auch als Grund genannt wird.

Mit Schleifen wüsste ich auch nicht wie ich das lösen soll, da der Alghoritmus nicht fix ist. Es kann sein, das der Bot bzw. das Spiel die Verbindung verliert und ich danach an einer anderen Stelle wieder rauskomme. Würde ich das ganze also in eine Schleife packen und nach und nach abarbeiten wollen, ginge das nicht - ich bräuchte quasi Sprungmarken.

Jemand eine Idee?
01/19/2013 14:31 butter123#2
also das hat damit zu tun, dass wenn du eine funktion "2" in einer funktion "1" aufrufst, autoit erstmal 2 bis zum ende ausführt und dann an der stelle weitermacht, wo es in 1 aufgehört hat. wenn jz in 2 steht ruf 1 auf, aber in 1 wieder steht ruf 2 auf, dann kommt die fkt nie zum ende und es stapelt sich immer weiter auf. wenn dann irgendwann eine funktion zu ende kommt, wird die vorherige beendet, dann die davor, dann die davor... das tut es bei dir aber anscheinend nicht, als wird der "stapel" an funktionen immer höher. ich hoffe ich konnte es ein bisschen erklären. wenns noch nciht klar ist, versuch ich nochmal ein beispiel zu finden^^

zur lösung:
mach doch nur eine funktion, die so aufgebaut ist:
PHP Code:
While 1
    
If bedingung And $True Then
        inhalt der 1. fkt
        
$False
        
$True
    
EndIf
    
    If 
bedingung And $2    True Then
        inhalt der 2. fkt
        
$False
        
$True
    
EndIf
    
    If 
bedingung And $True Then
        inhalt der 3. fkt
        
$False
        
$True
    
EndIf
WEnd 
das ist das einzige was mir grad eingefallen ist, vllt gibs noch was besseres
01/19/2013 15:48 jacky919#3
Im schimmsten Falle sehen deine Funktionsaufrufe etwa so aus. Wie du siehst wiederholst sich das ab einem bestimmten Punkt immer wieder.
Code:
func1 ->
          func2 ->
                    func3 ->
                              func1 ->
                                        func2 ->
                                                  func3 ->
                                                            func1 ->
                                                                      ....
Die vermeintliche Zufälligkeit hinter den Abstürzen wird dadurch verursacht, dass da ewige Durchlaufen dadurch unterbrochen werden kann, dass eine der Bedingungen in func2 oder func3 falsch sind. D.h. wenn alle Bedingungen zu jedem Zeitpunkt wahr sind, wird das Rekursionslimit sehr schnell erreicht, sollten die Bedingungen nur sehr selten wahr sein, kann das Programm relativ lange funktionieren.
Das Rekursionslimit kann in der Dokumentation abgelesen werden und beträgt 5100. Also wird dein Programm sicherheitshalber abstürzen, wenn func1 sich indirekt 5100 aufgerufen hat.
01/19/2013 16:10 iZz0s#4
Danke vielmals schon.

Verstehe so halbwegs.

Also ist eig. die einzige Lösung, ohne Funktionen auszukommen bzw. es nach butter's Methode zu machen?
01/20/2013 04:47 lolkop#5
nur weil folgende funktion, beim aufruf keinerlei fehler verursacht, heist es nicht, das es wirklich sinnvoll ist, die funktion so aufzubauen....

Code:
A()
Func A()
    A()
EndFunc
du musst bedenken, das A jedes mal wieder erneut in A aufgerufen wird. letztendlich verfängt man sich in einer endlosen rekursiven schleife, welche natürlich innerhalb kürzester zeit den stack überlastet....