Stack Overflow?!

  • Hallo ich hba mal wieder ein kleines Problem worauf ich keine Antwort gefunden habe und zwar geht es um meinen Script.
    Er löuft zwar einige Sekunden doch dann kommt der Fehler:

    Code
    C:\Dokumente und Einstellungen\I3iLLiG\Desktop\W0W B0t.au3 (37) : ==> Recursion level has been exceeded - AutoIt will quit to prevent stack overflow.: 
    call ("Main") 
    
    
    >Exit code: 1    Time: 32.102

    So ich poste mal mein Autoit Script es ist ein Wow bot ich weiß das es nicht gern gesehen ist aber glaubt mir ich benutze das nur um zu lernen und werde es nicht benutzen.

    Spoiler anzeigen
    [autoit]


    HotKeySet("{ESC}", "beybey")
    HotKeySet("0", "Pause")

    [/autoit] [autoit][/autoit] [autoit]

    if not WinActivate("World of Warcraft") then
    MsgBox(0, "W0W B0t Error", "'World of Warcraft' not running.")
    Exit (0)
    EndIf
    WinActivate("World of Warcraft")
    WinWaitActive("World of Warcraft")

    [/autoit] [autoit][/autoit] [autoit]

    call ("Main")

    [/autoit] [autoit][/autoit] [autoit]

    Func Main()
    while 1
    ;call ("Laufen")
    call ("Target")
    call ("Angreifen")
    call ("Pluendern")
    Wend
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;Func Laufen()
    ;ToolTip ("Beginne zu Laufen.",10,10,"W0W B0t",1)
    ;EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Target()
    ToolTip ("Schaue nach ob Target.",10,10,"W0W B0t",1)
    sleep(100)
    Send ("{Tab}")
    sleep(400)
    PixelSearch( 200,20,500, 500, 0x008700)
    If Not @error Then
    call ("Angreifen")
    EndIf
    If @error Then
    call ("Main")
    Endif
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Angreifen()
    ToolTip ("Wichtel greift an.",10,10,"W0W B0t",1)
    Send ("{CtrlDown}")
    Send ("1")
    Send ("{CtrlUp}")
    sleep (500)
    ToolTip ("Caste Hotkey 5.",10,10,"W0W B0t",1)
    Send ("5")
    sleep (3000)
    ToolTip ("Caste Hotkey 2.",10,10,"W0W B0t",1)
    Send ("2")
    sleep (3000)
    ToolTip ("Caste Hotkey 3.",10,10,"W0W B0t",1)
    Send ("3")
    Sleep (3500)
    ToolTip ("Caste Hotkey 4.",10,10,"W0W B0t",1)
    Send ("4")
    sleep(1000)
    ToolTip ("Caste Hotkey 1.",10,10,"W0W B0t",1)
    Send ("1")
    Sleep(6000)
    PixelSearch( 200,20,500, 500, 0x008700)
    If Not @error Then
    call ("Angreifen")
    EndIf
    If @error Then
    call ("Pluendern")
    EndIf
    EndFunc

    Func Pluendern()
    ToolTip ("Versuche zu Plündern.",10,10,"W0W B0t",1)
    MouseMove(396, 372,0)
    Send("{SHIFTDOWN}")
    MouseClick("right")
    Send("{SHIFTUP}")
    sleep(501)
    MouseMove(627, 373,0)
    Send("{SHIFTDOWN}")
    MouseClick("right")
    Send("{SHIFTUP}")
    sleep(501)
    MouseMove(540, 502,0)
    Send("{SHIFTDOWN}")
    MouseClick("right")
    Send("{SHIFTUP}")
    sleep(501)
    MouseMove(505, 474,0)
    Send("{SHIFTDOWN}")
    MouseClick("right")
    Send("{SHIFTUP}")
    sleep(501)
    MouseMove(514, 285,0)
    Send("{SHIFTDOWN}")
    MouseClick("right")
    Send("{SHIFTUP}")
    sleep(501)
    MouseMove(545, 418,0)
    Send("{SHIFTDOWN}")
    MouseClick("right")
    Send("{SHIFTUP}")
    sleep(501)
    ToolTip ("Beginnt von Neuem.",10,10,"W0W B0t",1)
    call ("Main")
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func beybey()
    Exit(0)
    Endfunc

    [/autoit] [autoit][/autoit] [autoit]

    Func Pause()
    MsgBox(0,"W0W B0t", "Paused...")
    sleep (10000)
    Endfunc

    [/autoit] [autoit][/autoit] [autoit][/autoit]
    • Offizieller Beitrag

    Hallo,

    schon mal was von Rekursion gehört, dass was Du da programmiert hast ist eine Endlos-Rekursion.

  • Zitat

    Original von bernd670
    Hallo,

    schon mal was von Rekursion gehört, dass was Du da programmiert hast ist eine Endlos-Rekursion.

    Mhh ja der Script soll ja uch solange laufen bis ich abbreche durch Esc.
    Warum bekomm ich aber dann den Fehler...

    Edit: mh ich finde jetzt nix anderes außer call...

    Edit2: achso jetzt ich hab das ja in while schleife gesetzt sozusagen hat der ja schleife + functionen ausgeführt und somit immer eiter aufgestockt -> stack ok alles klar hab ich verstanden aber das mit der anderen Art aufrufen würde mich intressieren.

    2 Mal editiert, zuletzt von I3iLLiG (17. August 2007 um 02:11)

  • Schau dir doch mal in der Online-Hilfe im Kapitel "Language Reference" die Functions an:

    also z.B.

    [autoit]

    ;...Programm ...

    [/autoit][autoit][/autoit][autoit]

    MeineFunktion() ; Funktionsaufruf

    [/autoit][autoit][/autoit][autoit]

    ;... Programm ....

    [/autoit][autoit][/autoit][autoit]

    Func MeineFunktion()
    ; ....Anweisungen ....
    Return
    EndFunc

    [/autoit]

    Viele Grüße
    Stilgar


    P.S.
    Dafür weis ich nun das es in AutoIt so etwas wie Call gibt :D

  • Hallo.

    Leider weiß ich nicht, was ein "Stack Overflow" ist. wäre einer so nett und erklärt es mir mal?

    Merci, Dank, Thanks.

    LG, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Der entsteht (meist) durch endlos rekursiven Aufruf von Funktionen.
    Bei jedem Aufruf einer Funkion, muß sich das "Programm" merken an welche Stelle es zurückspringen soll. Dies merkt es sich auf in einem Speicherbereich genannt Stack, der aber nur begrenzten Speicherplatz hat. Wenn nun keinerlei Rücksprung mehr erfolgt läuft irgendwann dieser Speicher "über", das nennt sich dann Stack Overflow.


    Viele Grüße
    Stilgar

  • Ein Stack ist ein Stapelspeicher.
    Also ein Datenstruktur welche mehrere Elemente aufnehmen kann (wie ein Array also z.b.).
    Wenn ein Elemente hinzugefügt wird wird es an das Ende des Stacks angefügt.
    Und nur auf dieses, als letztes hinzugefügtes, Element kann man zugreifen.
    Man kann also nur das Element, welches man als erstes hinzugefügt hat, sehen wenn man alle anderen herausgenommen hat.
    Deswegen bezeichnet man diese Form auch als "Kellerspeicher".
    Man wirft bildlich gesprochen alle Elemente nacheinander in einen tiefen Keller und kann daher nur das oberste und als letzte hineingeworfene Element sehen.

    Als Darstellung (von Wikipedia entnommen):
    [Blockierte Grafik: http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Data_stack.svg/391px-Data_stack.svg.png]

    Die Register in einer CPU sind sehr oft Stacks.
    Allerdings können sie nicht unendlich viele Elemente aufnehmen.
    Im Falle der Rekursion wird jede Rekursion nacheinander in den Stack eingefügt.
    Das heißt die tiefste Rekursionsebene liegt im Stack ganz oben und wenn man die erste Ebene ausrechnen will muss man erst alle Ebenen von der tiefsten her abarbeiten.
    Hier ist es aber nun so das es zu viele Rekursionsebenen sind - zu viele als das der Stack sie aufnehmen kann und es erscheint der "Stack Overflow" Fehler.

    Edit: Ja klar - war ja zu erwarten... wieder zu spät... ;(

    Einmal editiert, zuletzt von AspirinJunkie (18. August 2007 um 16:59)

  • jepp, das habe ich verstanden.

    DANKE !!!

    LG, Lina.

    Lieben Gruß,
    Alina

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Geheime Information: ;)
    OuBVU5ebLhHu5QvlnAyQB4A7SzBrvWulwL7RLl2BdH5tI6sIYspeMKeXMSXl

  • Gibs für das Prolem (ich hab es nämlich auch) auch ein Lösungsvorschlag??


    Ja, mach dir mal deinen Programmablauf klar :)

    Spoiler anzeigen

    Mainloop -> Target -> Angreifen() -> Pluendern()
    Mainloop: Schleife :) <|---------------------------------------------------------------|
    :::Target() ...........................................................................|
    ::::::entweder Angreifen -> Angreifen() .............................................. |
    :::::::::oder nichts tun -> Return ( Funktion beenden, Mainloop wird weiter ausgeführt |
    ...Target beenden ......................................... ...........................|
    wieder im Mainloop --------------------------------------------------------------------|
    :::::::::Angreifen() <-------------------------------- --------|
    :::::::::::: Solange kein error weiter angreifen -> Schleife --|
    ::::::::::::Error eben Schleife beenden ExitLoop und Plündern -> Pluendern()
    ::::::::::::::: Pluendern()
    :::::::::::::::::: Plündern und return
    .............. Pluendern beenden
    .........Angreifen wird beendet
    ...Target wird beendet
    wieder im Mainloop

    und btw: hat es einen Nachteil, wenn man Funktionen "callt" ?


    JA dein Skript wird langsamer

    2 Mal editiert, zuletzt von progandy (25. Juli 2008 um 18:51)