Funktion in Funktion definieren

    • Offizieller Beitrag

    Hi,
    Funktionen lassen sich in AutoIt nicht innerhalb von Funktionen definieren. In einigen Fällen, wäre sowas aber ganz brauchbar um z.B. mehrfach in einer Funktion eine seperate Routine auszuführen. Natürlich ließe sich das mit einer externen Funktion lösen, aber wenn diese Routine nur innerhalb der einen Funktion benötigt wird, ist es auch von der Übersichtlichkeit u.U. "schöner" alles beieinander zu haben ;).
    Um nun eine Funktion innerhalb einer Funktion defakto doch zu ermöglich kann man den Rekursiven Funktionsaufruf dazu "mißbrauchen" :D.

    Und so läßt sich das umsetzen:

    [autoit]

    MsgBox(0, 'Func-In-Func', _FuncInFunc(2, 3))

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

    Func _FuncInFunc($_p1, $_p2, $_fSub=False)
    Local $iReturn
    If $_fSub Then
    ; == hier die Funktion innerhalb der Funktion definieren, nur wirksam, wenn mit Parameter $_fSub=True aufgerufen
    $iReturn = $_p1^$_p2
    Else
    ; == hier die Standard-Funktion, die die Sub-Funktion aufruft
    $iReturn = ($_p1 + $_p2) * _FuncInFunc($_p1, $_p2, True) ; == (2+3) * 2^3 = 40
    ; == irgendwelche weitere Operationen
    ;..
    ;..
    ; == und nun nochmal die Sub-Funktion
    $iReturn += _FuncInFunc(5, 2, True) ; == 40 + 5^2 = 40 +25 = 65
    EndIf
    Return $iReturn
    EndFunc

    [/autoit]


    Vielleicht mal zum Vergleich die Variante mit getrennter Deklaration, wie allgemein üblich:

    [autoit]

    MsgBox(0, 'Aufruf separat', _Main(2, 3))

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

    Func _Main($_p1, $_p2)
    Local $iReturn = ($_p1 + $_p2) * _Sub($_p1, $_p2) ; == (2+3) * 2^3 = 40
    ; == irgendwelche weitere Operationen
    ;..
    ;..
    ; == und nun nochmal die Sub-Funktion
    $iReturn += _Sub(5, 2) ; == 40 + 5^2 = 40 +25 = 65
    Return $iReturn
    EndFunc

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

    Func _Sub($_p1, $_p2)
    Return $_p1^$_p2
    EndFunc

    [/autoit]
  • So wie ich es verstanden habe, definiert man die Funktion also nur, FALLS die Bedingung wahr ist?! Geilo *_* Das kann mal echt zur Laufzeit beitragen :) *Thumbs Up*

    • Offizieller Beitrag

    So wie ich es verstanden habe, definiert man die Funktion also nur, FALLS die Bedingung wahr ist?! Geilo *_* Das kann mal echt zur Laufzeit beitragen


    Definiert wird die Funktion immer. Der Bool-Parameter switcht nur, welche Teile der Funktion zur Anwendung kommen. Und das ermöglicht es halt, die Funktion in sich selbst mehrfach aufzurufen um einen separaten Codeteil abzuarbeiten.
    Man kann das auch erweitern und mehrere SubCodeteile integrieren. Wichtig ist, dass man die Parameterzahl darauf zuschneidet. Hier mal ein mgl. Szenario:

    [autoit]

    MsgBox(0, 'Func-In-Func', _FuncInFunc(2, 3))

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

    Func _FuncInFunc($_p1, $_p2, $_fSub=False, $_p4=0, $_p5=0) ; == die Standard-Func benötigt nur 2 Param + Bool für Sub, die anderen Parameter werden für Sub-Aufrufe vorgehalten
    Local $iReturn
    If $_fSub Then
    ; == hier die Funktion innerhalb der Funktion definieren, nur wirksam, wenn mit Parameter $_fSub=True aufgerufen
    ; == $_p4 wird jetzt genutzt um unterschiedliche Sub-Routinen auszuführen, $_p5 als zus. Parameter
    Switch $_p4
    Case 0
    $iReturn = $_p1^$_p2
    Case 1
    $iReturn = ($_p1^$_p2) * $_p5
    Case 2
    $iReturn = ($_p1^$_p2) / $_p5
    EndSwitch
    Else
    ; == hier die Standard-Funktion, die die Sub-Funktion-0 aufruft
    $iReturn = ($_p1 + $_p2) * _FuncInFunc($_p1, $_p2, True) ; == (2+3) * 2^3 = 40
    ;..
    ; == Aufruf der Sub-Funktion-1
    $iReturn += _FuncInFunc(9, 2, True, 1, 10) ; == 40 + ( 9^2 *10 ) = 850
    ;..
    ; == Aufruf der Sub-Funktion-2
    $iReturn += _FuncInFunc(5, 2, True, 2, 5) ; == 850 + ( 5^2 /5 ) = 855
    ;..
    ; == und nun nochmal die Sub-Funktion-0
    $iReturn += _FuncInFunc(5, 2, True) ; == 855 + 5^2 = 880
    EndIf
    Return $iReturn
    EndFunc

    [/autoit]