return - frage

  • leider kann ích in der beschreibung des return befehls keine antwort finden :(
    ich möchte gerne wissen ob der return befehl wirklich immer nur in die überliegende
    funktion zurückkehrt oder ob es unter umständen sein kann, dass auch die überliegende funktion bei
    return übersprungen wird und aus der subroutine direkt in die main zurückgekehrt wird ?

    z.B.

    [autoit]


    While 1 ; hauptschleife / menüschleife
    _sub1()
    ;lande ich unter(welchen?) umständen auch manachmal direkt hier ?
    Wend

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

    Func _sub1
    _sub2()
    ;lande ich wirklich immer hier nach dem return ?
    _sub3()
    EndFunc

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

    Func _sub2
    return
    msgbox(0,"","Das passiert nicht mehr!")
    EndFunc

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

    Func _sub3
    msgbox(0,"","werde ich noch ausgeführt?")
    EndFunc

    [/autoit]

    Na ja, ich hoffe ihr wisst was ich meine.

    Einmal editiert, zuletzt von WhiteLion (27. Oktober 2010 um 11:24)

  • Mit Return kommst zu immer zur übergeordneten Funktion zurück.
    Wenn du zur main willst:


    Spoiler anzeigen
    [autoit]

    Func _mainLoop()
    While 1 ; hauptschleife / menüschleife
    _sub1()
    ;lande ich unter(welchen?) umständen auch manachmal direkt hier ?
    Wend
    EndFunc

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

    Func _sub1
    _sub2()
    ;lande ich wirklich immer hier nach dem return ?
    _sub3()
    EndFunc

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

    Func _sub2
    _mainLoop()
    msgbox(0,"","Das passiert nicht mehr!")
    EndFunc

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

    Func _sub3
    msgbox(0,"","werde ich noch ausgeführt?")
    EndFunc

    [/autoit]
    • Offizieller Beitrag

    Mit Return kehrst du immer direkt in die aufrufende Funktion zurück (oder rufst mit Return _Irgendwas() eine weitere Funktion auf, die nach Beendigung aber ebenfalls an die ursprünglich aufrufende Funktion zurückgibt) . Eine Ebenenstaffelung (wie bei ExitLoop) gibt es hier nicht.
    Verschachtelte Funktionsaufrufe sind auch nicht sehr sinnvoll. Gib lieber immer an die "Zentrale" zurück und starte von dort den nächsten Aufruf. Verlierst du auch nicht so schnell den Überblick. ;)

    @Milla: Mit deinem Bsp. landet er in einer Endlosschleife.

  • ja schon klar da hab ich jetzt auch nicht weiter drauf geachtet ging mir eben nur um die tatsache wie man in die main kommt ohne return eben
    ne endlosschleife wars vorher auch schon ^^

  • okey danke :D wenn das ausgeschlossen ist, dann fällt meine bugsuche schon anders aus :)
    das mit der endlosschleife war jetzt nur ein beispiel was ich gerad hier rengeklatscht habe.
    das du lieber BugFix um verschachtelte funktionsaufrufe herumkommst, ist für mich schwer
    vorstellbar. bei meinem aktuellen projekt habe ich ca. 7500 zeilen code und komme definitiv
    nicht sinnvoll drumherum :)

    • Offizieller Beitrag

    das du lieber BugFix um verschachtelte funktionsaufrufe herumkommst, ist für mich schwer vorstellbar.


    :D Es ist schon klar, dass verschachtelte Aufrufe ihre Notwendigkeit haben. Und natürlich lagere ich auch viel Code in Sub-Routinen aus. Mir ging es bei meiner Bemerkung eher um die Verschachtelungstiefe - also nicht ein Aufruf, der dann das ganze Programm in 30 hintereinandergelagerten Subs abarbeitet. Ich gruppiere da i.A. thematisch.

    Übrigens, um auf die Startfrage zurückzukommen, kannst du ja über den Returnwert einen Rücksprung in die Main veranlassen, bzw. die weitere Abarbeitung verhindern:

    Spoiler anzeigen
    [autoit]

    _1()

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

    Func _1()
    _1_1()
    MsgBox(0, '', "wieder in _1()")
    EndFunc

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

    Func _1_1()
    Switch _1_2()
    Case 1
    Return
    Case 2
    _1_3()
    EndSwitch
    EndFunc

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

    Func _1_2()
    If MsgBox(36, '', 'zurück zur Main') = 6 Then Return 1
    Return 2
    EndFunc

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

    Func _1_3()
    MsgBox(0, '', 'Func _1_3')
    EndFunc

    [/autoit]
  • okey, dann bringt das meine autoit-vorstellungswelt wenigstens nicht durcheinander. :)
    leider stehe ich wieder vor meinem bug problem bzw bin weiter von einem bugfix ;) entfernt.
    schade das es keinen funktionierenden debugger gibt :(

    • Offizieller Beitrag

    schade das es keinen funktionierenden debugger gibt


    Kannst ja mal dein Glück versuchen mit dem Graphical Debugger von Stumpii. Dazu muß dein PC aber gut "motorisiert" sein. Mit meinem Laptop (1,5 GHZ / 512 MB RAM) bekomme ich das Teil man grade so gestartet, kann dann aber nichts ausführen.

  • das teil kenne ich schon, wenn ich mein script(oder andere etwas umfangreiche scripts) damit starte(run), dann passiert einfach nix, ausser das es einmal ein gui-refresh des debuggers gibt... mein laptop is 2Ghz core2duo / 4gb ram. also daran liegts wohl nicht.