kurze frage: Globale Variablen in einer Funktion zuweisen ... für späteres reset ...

  • 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!

    4 Mal editiert, zuletzt von UPIA (7. Dezember 2011 um 17:38)

  • Du brauchst weder Option 1 noch Option 2. Global kannst ganz weg lassen.

    Kleines Beispiel zum verdeutlichen:

    Spoiler anzeigen
    [autoit]

    $y = "lala"
    ConsoleWrite("Vor der Funktion: "& $y & @CRLF)
    setupY()

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

    Func setupY()
    ConsoleWrite("In der Funktion: "& $y & @CRLF)
    $y = "huhu"
    ConsoleWrite("Nach ändern in der Funktion: "& $y & @CRLF)
    EndFunc

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

    ConsoleWrite("Nach der Funktion: "& $y & @CRLF)

    [/autoit]

    Dim, Local, Global brauchst nur wenn "AutoItSetOption("MustDeclareVars", 1)" gesetzt hast.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • 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

    Spoiler anzeigen
    [autoit]

    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)

    [/autoit]

    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

    [/autoit]
  • 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 ;).

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • 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!!!!


    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.

    Einmal editiert, zuletzt von UPIA (7. Dezember 2011 um 13:30)

  • 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??

    Einmal editiert, zuletzt von UPIA (7. Dezember 2011 um 16:35)

  • 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:

    [autoit]

    Global $y[2] = [1, 2]

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

    Func setupY()
    Dim $y[2] = [5, 6]
    EndFunc

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

    setupY()
    ConsoleWrite($y[1] & @CRLF)

    [/autoit]
  • 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! :thumbup: