hi leute,
ich moechte einige globale variablen in einer funktion zuweisen, damit ich sie später wieder per funktionsaufruf auf den ausgangswert zurücksetzen kann.
hat das irgendwelche nachteile? (option 1 wäre mir lieber, weil weniger code).
thx!
hi leute,
ich moechte einige globale variablen in einer funktion zuweisen, damit ich sie später wieder per funktionsaufruf auf den ausgangswert zurücksetzen kann.
hat das irgendwelche nachteile? (option 1 wäre mir lieber, weil weniger code).
thx!
Du brauchst weder Option 1 noch Option 2. Global kannst ganz weg lassen.
Kleines Beispiel zum verdeutlichen:
$y = "lala"
ConsoleWrite("Vor der Funktion: "& $y & @CRLF)
setupY()
Func setupY()
ConsoleWrite("In der Funktion: "& $y & @CRLF)
$y = "huhu"
ConsoleWrite("Nach ändern in der Funktion: "& $y & @CRLF)
EndFunc
ConsoleWrite("Nach der Funktion: "& $y & @CRLF)
[/autoit]Dim, Local, Global brauchst nur wenn "AutoItSetOption("MustDeclareVars", 1)" gesetzt hast.
so nicht richtig chip
Wenn man Variablen Lokal deklariert werden die nur in der Funktion genutzt, nach dem Funktionsaufruf aber wieder verworfen, auch wenn AutoItSetOption("MustDeclareVars", 1)" nicht gesetzt ist
Heißt, das der Speicher nach den Funktionsaufrufen wieder freigegeben wird.
Dein Beispiel klappt nur, weil Autoit Alle Variablen Global deklariert, wenn sie nicht anders deklariert sind.
Alle Variablen, die nicht in einem Funktionsaufruf stehen sind sowieso Global
Wenn ich bei deinem Beispiel Local y = "lala" nehme klappt es zwar noch, aber bei diesem Beispiel nicht mehr
Declare()
setupY()
Func Declare()
Local $y = "lala"
ConsoleWrite("Vor der Funktion: "& $y & @CRLF)
EndFunc
Func setupY()
ConsoleWrite("In der Funktion: "& $y & @CRLF)
$y = "huhu"
ConsoleWrite("Nach ändern in der Funktion: "& $y & @CRLF)
EndFunc
ConsoleWrite("Nach der Funktion: "& $y & @CRLF)
UPIA du kannst die Variablen $x, $y bereits zum Anfang deines Scriptes deklarieren
[autoit]
Global $x, $y
setupX()
ConsoleWrite($x & @CRLF)
setupY()
ConsoleWrite($y & @CRLF)
; option 1
Func setupX()
$x = 5
EndFunc
; option 2
Func setupY()
$y = 2
EndFunc
Die Frage dreht sich um Global und nicht im Local und du musst nur bei dem Parameter "AutoItSetOption("MustDeclareVars", 1)" die Variablen eindeutige deklarieren. Ansonsten steht es dir frei. Bitte erst richtig lesen dann posten ;).
hi leute ...
danke fuer die schnelle hilfe!
im ersten post funzt option 2 nicht - mein fehler ... ebenso ... mustdeclare hat gefehlt.
... werde variante wie bei setupX verwenden. die setup funktionen fuehre ich dann zu beginn des scripts gleich nach den includes ein. (ich hatte zuerst include files für die variablen, wurden aber zu viele, weil ich sie teilweise resetten muss)
merci!!!!
AutoItSetOption("MustDeclareVars", 1) ; hatte ich beim testen vergessen :(
Global $y
Func setupX()
Global $x = 1 ; ->ok
EndFunc
Func setupY()
$y = 2 ; ->ok, weil vorher als global gesetzt
EndFunc
Func setupZ()
$z = 3 ; -> Fehler
EndFunc
setupX()
ConsoleWrite($x & @CRLF)
setupY()
ConsoleWrite($y & @CRLF)
setupZ()
ConsoleWrite($z & @CRLF) ; ---> error!
Alles anzeigen
EDIT: .. hab grade festgestellt, dass diese methode (setupX) natürlich warnings auslöst beim syntax-check, kann man beheben, wenn die funktion setupX ganz oben im code steht.
besser/schöner wäre schon die variante die variable erst allgemein als global zu setzen und dann per funktion zuweisen, aber finde ich irgendwie redundant.
Dein Beispiel klappt nur, weil Autoit Alle Variablen Global deklariert, wenn sie nicht anders deklariert sind.
Nicht ganz richtig.
Wenn eine Variable in einer Funktion ohne expliziten Sichtbarkeitsbereichsbezeichner (global, local) deklariert wird wird sie implizit als Dim $var deklariert.
Dies bedeutet dann:
Existiert im globalen schon eine Variable mit diesem Namen so verweist die eben deklarierte auf diese globale Variable (es wird keine neue globale Variable erstellt!).
Gibt es hingegen keine globale Variable mit diesem Namen wird die Variable als neue lokale Variable der Funktion deklariert.
In keinem Fall wird eine neue globale Variable erstellt.
UPIA
Mach es so wie es dir beide schon geschrieben haben.
Deklariere die Variablen am Anfang global und nutze sie dann ganz normal in den Funktionen ohne sie dort nochmal zu deklarieren.
... hmmmm
es handelt sich bei den meisten vars um arrays.
jede änderung der variablen muss dann leider an mehreren stellen durchgeführt werden, das wollte ich halt irgendwie vereinfachen.
besteht denn irgendeine begründete gefahr, dass die quick-and-dirty methode probleme verursacht??
besteht denn irgendeine begründete gefahr, dass die quick-and-dirty methode probleme verursacht??
Gefahr besteht wenn auf die Variable zugegriffen wird bevor die Funktion aufgerufen wurde und wenn die Funktion mehrmals aufgerufen wird - dann wird die Variable wieder zurückgesetzt.
Warum es einfacher sein soll extra eine Funktion zu schreiben in der man eine Variable deklariert anstatt diese ohnehin notwendige Deklaration außerhalb zu schreiben ist mir auch nicht ganz klar.
Wahrscheinlich ist dein Problem das du die Initialisierung eines Arrays in einer Zeile auch auf schon vorhandene Arrays anwenden willst.
Wenn es wirklich das ist dann wäre dies ein Vorschlag:
Global $y[2] = [1, 2]
[/autoit][autoit][/autoit][autoit]Func setupY()
Dim $y[2] = [5, 6]
EndFunc
setupY()
ConsoleWrite($y[1] & @CRLF)
hi .. danke erstmal, dass ihr zu diesem philosophischen thema postet...
ich habe ca. 300 variablen, die meisten arrays mit etlichen zeilen, die ich ständig nachbessern muss (bzw. mir diese option offen halten will). daher habe ich nach einem vereinfachten ansatz gesucht und wollte mich erstmal absichern, dass es keine einfachere saubere loesung gibt.
-> die seite mit den setup funktionen wird per include als allererstes aufgerufen
-> die variable soll bei erneutem aufruf auch zurückgesetzt werden
-> ich wollte mir einfach sparen an zwei stellen die variable zu ändern und gleichzeitig die ohnehin notwendige reset-funktion erstellt haben...
okay, werde sie alle nach vorschrift deklarieren, bis auf einen satz daten und dann mal schauen ob es probleme bereitet.
nochmals dankeschoen für eure zeit!