- 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
Vielleicht mal zum Vergleich die Variante mit getrennter Deklaration, wie allgemein üblich:
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
Func _Sub($_p1, $_p2)
Return $_p1^$_p2
EndFunc