Wie / Wo werden Funktionsaufrufe gespeichert? Kann man diesen "Speicher" löschen?

  • Hallo zusammen,

    folgendes Phänomen bereitet mir derzeit einiges Kopfzerbrechen:

    In einer Funktion werden mehrere Anweisungen ausgeführt, der "Vollzug" der einzelnen Anweisungen wird jeweils kontrolliert. Wenn etwas nicht klappt rufe ich die Funktion erneut auf, um von vorne zu beginnen, da die Reihenfolge vorgegeben ist und immer vollständig durchlaufen werden muss. (ein Beispiel wäre ein Einlog-Script)

    Jedoch werden die erfolglosen Durchläufe irgendwie/wo gespeichert, denn nach erfolgreichem Durchlaufen der Funktion spulen sich die "Fehlversuche" ebenfalls ab, genauso oft, wie die Funktion eben aufgerufen wurde [in BASIC hätte ich es mit GOTO ANFANG gelöst :D ].

    Kann man den "Schleifespeicher" löschen, gibts eine elegantere Lösung?

    Bitte um Hinweise ...........

    CU

  • Wenn die Funktion so lange neu gestertet werden soll, bis sie funktioniert, könnte man z.B. das machen:

    Spoiler anzeigen
    [autoit]

    Global $Versuche = 0
    Global Const $MAX_VERSUCHE = 3

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

    Do
    $Versuche += 1
    $erfolg = _Einloggen("user","pass")
    Until $erfolg = True Or $Versuche >= $MAX_VERSUCHE

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

    If $erfolg = False Then
    MsgBox(0, '', "immer noch falsch nach "&$Versuche&" versuchen")
    Exit
    EndIf

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

    MsgBox(0, '', "Angenommen nach "& $Versuche & "Versuchen")

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

    Func _Einloggen($user,$pass)
    Local $UserOK = MsgBox(4,"Name","Benutzer annehmen?" & @CRLF & $user)=6
    If $UserOK = False Then Return False

    Local $PassOK = MsgBox(4,"Passwort","Passwort annehmen?" & @CRLF & $pass)=6
    If $PassOK = False Then Return False

    Return True ; User und Pass stimmen
    EndFunc

    [/autoit]
  • Also ein konkretes Script habe ich derzeit nicht, aber prinzipiell ist es so gemeint:

    [autoit]

    Func start ()
    ;Anweisungen wie z.B. Seitenanwahl etc.
    $inaktiv = TimerInit()
    While (1)
    ;send(Passwort)
    ;send(ENTER)
    $Pixel_Logo = Pixelsearch ( x,y,x1,y1,farbe )
    If not @Error Then
    ;weitere Eingaben wenn das Logo erscheint
    ;ExitLoop
    EndIf
    $inaktiv_diff = TimerDiff($inaktiv)
    if $inaktiv_diff > 50000 Then
    start ()
    EndIf
    WEnd
    Endfunc

    [/autoit]

    Edit 1:Sorry, aber bei mir schluckt er immer die Einrückungen im Script :cursing:

    Edit 2: Danke @progandy@, ist ne gute Lösung um eine einzelne Funktion zu überprüfen, das werde ich mal testen. Aber wie ist das mit dem "Speicher" für Funktionsaufrufe? Vielleicht denke ich nur zu umständlich ..... ?(

    • Offizieller Beitrag

    Benutze einfach ineinander verschachtelte Schleifen:

    Spoiler anzeigen
    [autoit]


    start()
    Func start()
    Local $i
    While 2
    ;Anweisungen wie z.B. Seitenanwahl etc.
    $inaktiv = TimerInit()
    While (1)
    ;send(Passwort)
    ;send(ENTER)
    $inaktiv_diff = TimerDiff($inaktiv)
    If $inaktiv_diff > 50000 Then ExitLoop
    WEnd
    WEnd
    EndFunc ;==>start

    [/autoit]
    • Offizieller Beitrag

    Das ist auch so einfach, wenn man erstmal aufgehört hat in GOTO-Dimensionen zu denken. GOTOs sind (zum Glück) nicht in AutoIt enthalten. Die führen nur zu "unlesbaren" Code.
    Mit den Schleifenbefehlen (While...WEnd, Do...Until und For...Next) kann man alle GOTOs vergessen.
    Funktionen hingegen, sind Unterprogramme (Routinen), die beim erreichen von EndFunc, von allein beendet werden oder mit Return vorzeitig (z.B. innerhalb einer If...Then-Anweisung) beendet werden können.
    Wenn man eine bestimmte Funktion innerhalb dieser Funktion wieder aufruft, so nennt man das Rekursion. Dafür gibt es durchaus Anwendungsmöglichkeiten, aber man muss auf die Abbruchbedingungen achten, sonst wird die max. Rekursionstiefe erreicht und das Script wird mit einer Fehlermeldung beendet. Als GOTO-Ersatz darf das aber nicht verwendet werden.

  • Danke Oscar,

    Deine Zusammenfassung hat nochmal zusätzlich Licht in meine GOTO-Dunkelheit gebracht.

    Auch wenn ich immer versuche, die "neue" Programmiersystematik umzusetzten, hänge ich doch in meinen Ansätzen manchmal noch an der "guten alten" Zeit ..... so habe ich es halt gelernt :whistling:

    Das mit dem RETURN (Abbruch und nicht nur Datenrückgabe) war mir neu und ist letztlich das, was ich schon häufig gesucht habe, um Rekursionen zu vermeiden.

    THX