Variablen: Dim / Global / Local / Const

  • Hallo, ich habe nie richtig verstanden was die Variablen bringen: Dim / Global / Local / Const

    Vielleicht heißen die auch nicht Variablen also bitte nicht so hart sein.
    Könnte mir vielleicht irgend einer erklären was der Unterschied zwischen

    [autoit]

    $variable = "Hallo Welt!"

    [/autoit]


    und den ist

    [autoit]

    Local $x, $y = 23
    Global $_PI = 3.14159, $RADIUS
    Dim $weeklyWorkSchedule[$_daysWorking]

    [/autoit]
  • Steht in der Hilfe schön beschrieben:
    http://translation.autoit.de/onlinehilfe/in…g_variables.htm
    bzw.
    http://translation.autoit.de/onlinehilfe/keywords/Dim.htm ;)

    Aber mal vorweg: Man sollte globale vermeiden. Und zwar so weit wie möglich.
    Siehe z.B. https://autoit.de/index.php?page=Thread&postID=203773

    There's a joke that C has the speed and efficieny of assembly language combined with readability of....assembly language. In other words, it's just a glorified assembly language. - Teh Interwebz

    C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do, you blow off your whole leg. - Bjarne Stroustrup
    Genie zu sein, bedeutet für mich, alles zu tun, was ich will. - Klaus Kinski

  • Zusammengefasst kann man sagen, dass die 2. Variante (die mit Keywords) sauberer ist (Variablen sollten immer so deklariert werden), und dass man 1) Local bei Variablen in Funktionen, 2) Global bei Variablen für das komplette Skript und 3) Dim gar nicht verwenden sollte.

  • Und um die letzte Variante

    [autoit]

    Const

    [/autoit]

    noch abzudecken:

    Hierbei handelt es sich um eine "schreibgeschützte Variable", also eine Konstante. Diese kann während der Laufzeit nicht geändert werden.

    • Offizieller Beitrag

    Hallo,

    Man sollte eigentlich nur Konstanten (Const) und Konstante-Enumerations (Enum) Global deklarieren. Z.B. die ganzen WM_COMMAND Funktionen, aber auch ggf den Titel des Programms damit in allen Fenstern der Titel gleich ist (falls man ihn mal ändert). Variable Variablen (höhö) sollte man niemals Global benutzten, entweder wie schon beschrieben mit ByRef oder gar mit Local Static.

    Noch mal kurz zu Enum: Enumeration (zu Deutsch Aufzählung) ist eine Aufzählung (tada). Hier mal nen Beispiel:

    [autoit]

    Global Enum $Erster, $Zweiter, $Dritter, $Vierter
    Global Enum Step 2 $Erster1, $Zweiter1, $Dritter1, $Vierter1
    Global Enum Step * 2 $Erster2, $Zweiter2, $Dritter2, $Vierter2

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

    MsgBox(0,"Normal",$Erster&","&$Zweiter&","&$Dritter&","&$Vierter)
    MsgBox(0,"Step 2",$Erster1&","&$Zweiter1&","&$Dritter1&","&$Vierter1)
    MsgBox(0,"Mal zwei",$Erster2&","&$Zweiter2&","&$Dritter2&","&$Vierter2)

    [/autoit]

    Und zu Static:

    [autoit]

    While 1
    _Test(@SEC);Wird 100 mal die Sekunde aufgerufen, zeigt aber nur die Sekunde an, wenn sich die aktuelle Sekunde ändert
    Sleep(10)
    WEnd

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

    Func _Test($iVar)
    Local Static $iVar_Old = -1;iVar_Old initieren, beim ersten mal ist es -1
    If $iVar = $iVar_Old Then Return False;Wenn neuer Wert = Alter Wert ist, return
    $iVar_Old = $iVar;Danach wird iVar_Old immer mit der aktuellen Variable (sekunde) gesetzt
    ConsoleWrite($iVar & @LF);Ausgabe
    EndFunc

    [/autoit]

    Gruß,
    Spider