Wie kann ich zu einer anderen Stelle im Script springen?

  • Hi zusammen,

    ich habe ein recht großes Script geschrieben, allerdings bekomme ich früher oder später folgende Fehlermeldung:

    [Blockierte Grafik: http://img355.imageshack.us/img355/1081/bugip6.jpg]

    Das ganze Programm ist so geschrieben, dass es in verschiedenen Zuständen verbleibt und dort auf eine Eingabe wartet. Falls der User eine bestimmte Eingabe macht oder ein bestimmtes Ereignis eintritt wechselt es je nachdem zu einer bestimmten Funktion. Um zwischen den einzelnen Zuständen zu wechseln, habe ich das Script in verschiedene Funktionen unterteilt. Um von einer Funktion in eine andere zu wechseln, rufe ich innerhalb von Funktion A Funktion B auf und umgekehrt, je nachdem, in welchen Zustand das Programm wieder soll.

    Das Dumme ist jetzt, dass die einzelnen Funktionen so natürlich nie enden.

    Ein Beispiel

    Func Funktion_A()
    [Code mit Auswertung von User-Input]
    Funktion_B()
    EndFunc


    Func Funktion_B()
    [Code mit Auswertung von User-Input]
    Funktion_A()
    EndFunc


    Kann man irgendwie zu einer anderen Stelle im Programm springen, ohne eine Funktion zu verwenden? Oder wie kann ich das Programm in einen anderen Zustand bringen ohne, dass eine aufgerufene Funktion nicht beendet wird? Alternativ: Wie kann ich "offene Funktionen" im Hintergrund beenden, so dass sie nicht mehr auf einen Return warten?

    Kann mir jemand helfen? Ich arbeite jetzt schon über einen Monat an diesem Programm und weiß nicht, wie ich es sonst aufbauen könnte.

    spyro

    • Offizieller Beitrag

    Hallo,

    eine Möglichkeit wäre folgendes:

    [autoit]

    $szResult = Funktion_A()
    While 1
    Switch $szResult
    Case "Funktion_A"
    $szResult = Funktion_A()

    Case "Funktion_B"
    $szResult = Funktion_B()
    EndSwitch
    WEnd

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

    Func Funktion_A()
    ; [Code mit Auswertung von User-Input]
    Return "Funktion_B"
    EndFunc

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

    Func Funktion_B()
    ; [Code mit Auswertung von User-Input]
    Return "Funktion_A"
    EndFunc

    [/autoit]
  • Danke Bernd! :)

    Ich werde es mal ausprobieren. Scheint ja ziemlich kompliziert zu sein.
    Gibt es keine Möglichkeit, eine im Hintergrund noch laufende Funktion quasi "von außen" zu beenden bzw. abzuschießen?

    EDIT:

    Habe es jetzt folgendermaßen gelöst:

    Ich deklariere am Anfang eine globale Variable $state. Diese soll immer die nächste aufzurufende Funktion speichern und mittels RETURN zurückgeben.

    Das Programm selbst läuft also permanent in einer kleinen Schleife:

    [autoit]


    $state = "Funktion_A"

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

    While 1
    Call ($state)
    WEnd

    [/autoit]

    Wenn eine Funktion beendet wurde und daraufhin wieder eine neue Funktion aufgerufen werden soll, übergibt diese die nächste aufzurufende Funktion mittels der Variable $state:

    [autoit]


    Func Funktion_A()
    ....
    Return "Funktion_B"
    EndFunc

    [/autoit]

    Danke für den Stoß in die richtige Richtung! Ohne dich hätte ich mein Programm wohl beerdigen können.

    spyro

    Einmal editiert, zuletzt von spyro (12. Juli 2007 um 18:37)

    • Offizieller Beitrag

    Nein, die Möglichkeit gibt es meines Wissens nicht - aber du solltest mal über deine Programmstruktur nachdenken, ich kann mir gerade nichts vorstellen, bei dem man eine solche Rekursion brauchen würde (und das würde in jeder Programmiersprache mit einem RAM-Verbrauch von 100% enden). Vielleicht sagst du uns, worum es geht, dann können wir evtl. auch einen Ansatz liefern... peethebee