wie kann ich Autohotkey in Funktionen dazu zwingen dynamische Variablen konsequent als lokale Variabeln zu behandeln
ohne jeden moeglichen Variablennamen einzeln via
local VariablenName
zu notieren.
Zum Problem habe ich ein Beispielskript vorbereitet:
Loop 10 { if(mod(a_index,2)) ; ungerade Ganzahl { GanzZahl%A_Index%:=A_Index AnzeigeGanzzahl:=AnzeigeGanzzahl " " GanzZahl%A_Index% } } MsgBox % "Die ungeraden Ganzzahlen bis 10 `n" AnzeigeGanzzahl MsgBox % "8-Fakultaet `n" Fakultaet(8) ; dieser Aufruf bewirkt die Aenderungen der Globalen Variablen Loop 10 { if(mod(a_index,2)) ; ungerade GanzZahl { } else ; gerade GanzZahlen { GanzZahl%A_Index%:=A_Index AnzeigeGanzzahl:=AnzeigeGanzzahl " " GanzZahl%A_Index% } } MsgBox % "Die verutschten GanzZahlen von 1 bis 10`n" GanzZahl1 " " GanzZahl2 " " GanzZahl3 " " GanzZahl4 " " GanzZahl5 " " GanzZahl6 " " GanzZahl7 " " GanzZahl8 " " GanzZahl9 " " GanzZahl10 " " ExitApp Fakultaet(IGanzZahl) { LastErg:=1 Loop, % IGanzZahl { LastErg:=LastErg * A_Index GanzZahl%A_Index%:=LastErg } return GanzZahl%IGanzZahl% }
Mit der Funktion Fakultaet() ueberschreibe ich gleichnamige Globale Variablen
GanzZahl%A_Index%
des Hauptprogramms. Und zwar genau dann, wenn sie im Hauptprogramm schon irgenwo verwendet wurden oder undynamisch auftreten und in der Funktion noch nicht. Ueber
local GanzZahl1, GanzZahl2, GanzZahl3, GanzZahl4, GanzZahl5, GanzZahl6, GanzZahl7, GanzZahl8, GanzZahl9, GanzZahl10,
konnte ich dies verhindern. Dies Methode ist jedoch fuer eine grosse Variablenanzahl nicht mehr brauchbar. Das Anzahl-Element wie bei
StringSplit,Array,... ; Array0
gibt es hier nicht. Ueber dieses koennte ich ja via
local GanzZahl0
AHK anweisen alle zugehoerigen Elemente wirklich lokal zu behandeln.
Auch die Frage wozu AHK schreibend in Funktionen auf Globale Variabeln zugreift, wuerde mich brennend interessieren.
PS. wenn man die Zeile vor ExitApp auskommentiert, sieht man im Debugger schoen wie nur die ungeraden Zahlen ueberschrieben werden.