Schlüsselwortreferenz


Dim / Global / Local / Const

Beschreibung anzeigen in

Deklariert eine Variable, Konstante oder definiert ein Array.

Global | Local [Const] $variable [ = initializer ]
Global | Local [Const] $aArray[subscript 1]...[subscript n] [ = initializer ]

Parameter

Const [optional] Wenn angegeben, wird statt einer Variablen eine Konstante deklariert.
$variable Der Name der zu deklarierenden Variablen.
initializer Der Wert, welcher der Variablen am Anfang zugeteilt wird. Eine Konstante muss den Initializer enthalten. Der Initializer kann ein Funktionsaufruf sein.
subscript Die Anzahl Elemente eines Arrays (0 bis n-1).

Bemerkungen

Die Schlüsselwörter Dim, Local und Global haben eine ähnliche Funktionsweise:
1. Deklariert eine Variable, bevor sie verwendet wird (ähnlich zu VBScript)
2. Erzeugt ein Array

Hinweis: In AutoIt kann man eine Variable erzeugen, indem man ihr einfach einen Wert zuweist ($myvar = 0). Viele Leute deklarieren sie aber lieber explizit. Falls AutoItSetOption("MustDeclareVars", 1) aktiv ist, dann müssen Variablen vor der Benutzung explizit deklariert werden.

Es können auch mehrere Variablen in einer Zeile deklariert werden:

Local $vVar_1, $vVar_2, $vVar_3


Und man kann ihnen auch gleich einen Wert zuweisen, wenn die Variable kein Array ist:

Local $vVar_1 = 10, $vVar_2 = "20", $vVar_3 = 30



Die Erzeugung von Konstanten wird ähnlich durchgeführt:

Const $CONST_1 = 1, $CONST_2 = 2, $CONST_3 = 3
Global Const $PI = 3.14, $MEANING_OF_LIFE = 42
Local Const $iApples = 500


Wenn eine Konstante einmal erzeugt wurde, kann ihr Wert danach nicht mehr verändert werden. Außerdem kann man eine existierende Variable nicht in eine Konstante umwandeln.

Um ein Array zu deklarieren, sind die Maximalwerte für jedes Element in eckigen Klammern, getrennt durch Kommas anzugeben. Für mehrere Dimensionen sind die Initialisierer zu verschachteln. Es können weniger Elemente im Initialisierer festgelegt werden als deklariert, aber nicht mehr. Es können auch Funktionsaufrufe in dem Initializer eines Arrays platziert werden. Falls die Funktion ein Array zurückgibt, dann enthält dieses eine Arrayelement das zurückgegebene Array aus der Funktion.

Local $aArray_1[12] = [3, 7.5, "string"], $aArray_1[5] = [8, 4, 5, 9, 1]
Local $aGrid[2][4] = [["Paul", "Jim", "Richard", "Louis"], [485.44, 160.68, 275.16, 320.00]]
Global $aTest[5] = [3, 1, StringSplit("Abe|Jack|Bobby|Marty", "|"), Cos(0)]


Der Unterschied zwischen Dim, Local und Global ist der Gültigkeitsbereich, für den die Variablen deklariert werden:
Dim = Wenn der Variablename nicht schon mit globalem Gültigleitsbereich existiert, hat die definierte Variable einen lokalen Gültigkeitsbereich (falls die Variable schon global existiert, so wird die globale Variable verwendet.)
Global = Erzwingt globale Gültigkeit der Variablen
Local = Erzwingt lokale Gültigkeit der Variablen, bzw. innerhalb der Funktion

Man sollte Local oder Global anstelle von Dim verwenden, um explizit den Gültigkeitsbereich für die Variable / Konstante / Array festzulegen.

Wenn Variablen verwendet werden, wird zuerst geprüft, ob die Variable lokal existiert, und erst danach, ob sie global deklariert ist.

Wenn ein Array erzeugt wird, ist es auf maximal 64 Dimensionen und/oder 16 Millionen Elemente begrenzt.

Eine einzigartige Besonderheit in AutoIt ist die Möglichkeit, Arrays wie folgt zu kopieren:
$mycopy = $myarray
In diesem Fall ist $mycopy eine exakte Kopie von $myarray und hat dieselben Dimensionen - es ist keine vorherige Deklaration mit Dim nötig. Wenn AutoItSetOption("MustDeclareVars", 1) aktiv ist, dann muss die Variable $mycopy zuvor deklariert zu werden, die Angabe der Größe ist dabei nicht vonnöten. Wenn die Variable $mycopy bereits als Array deklariert war, wird es gelöscht, bevor das Kopieren stattfindet.

Um ein Array zu leeren (z.B., weil man den Speicherplatz eines großen, globalen Arrays freigeben möchte), weist man ihm einfach einen einzigen Wert zu:
$aArray = 0
Das gibt den Speicherplatz des Arrays frei und setzt es auf den einzigen Wert 0.

Deklariert man den Variablennamen erneut, werden alle Werte des Arrays gelöscht, und auf die neu definierte Größe dimensioniert.

Falls man eine Variable mit demselben Namen als Funktions-Parameter deklariert, oder wenn Local innerhalb einer Benutzerfunktion verwendet wird, tritt ein Fehler auf. Global kann verwendet werden, um es einer globalen Variablen innerhalb einer Funktion zuzuweisen. Aber wenn eine lokale Variable (oder Parameter) den selben Namen wie eine globale Variable besitzt, so wird die lokale Variable verwendet. Es ist empfehlenswert, den lokalen und globalen Variablen verschiedene Namen zu geben.

Verwandte Funktionen

AutoItSetOption, UBound, ReDim, Static

Beispiel

Beispiel 1

; Variablen deklarieren
Local $i, $j = 23, $k
Global $g_fPI = 3.14159, $g_iRADIUS
Local $iDaysWorking = 5

; Arrays deklarieren
Global $g_aChessBoard[8][8]
Global $g_aEmptyArray[0]
Global $g_aAutoSize[] = [1, 2, 3, 4]
Local $aStates[2], $aWindowsStats[4]
Local $a2Dimensions[2][3] = [[1, 2, 3], [4, 5, 6]]

; Konstanten deklarieren
Const $iX1 = 11, $iY1 = 23, $iZ1 = 55
Global Const $PI = 3.14159, $E = 2.71828
Local Const $DAYS_WORKING = 5

Beispiel 2

#AutoIt3Wrapper_Au3Check_Parameters=-q -d -w- 3 -w- 6 ; var bereits deklariert=off, warnen bei Verwendung von Dim=off

#include <MsgBoxConstants.au3>

Dim $vVariableThatIsGlobal = "Dies ist eine Variable mit dem ""Programm Anwendungsbereich"" auch bekannt als Global."

MsgBox($MB_SYSTEMMODAL, "", "Ein Beispiel dafür, warum Dim mehr Probleme verursachen als lösen kann.")

Example()

Func Example()
    ; Das sieht für mich in Ordnung aus, da es den folgenden Text anzeigt: Dies ist eine Variable mit dem "Programm Anwendungsbereich" auch bekannt als Global.
    MsgBox($MB_SYSTEMMODAL, "", $vVariableThatIsGlobal)

    ; Ruft eine Zufallsfunktion auf.
    Local $vReturn = SomeFunc()

    ; Die globale Variable ($vVariableThatIsGlobal) hat sich geändert, weil ich völlig vergessen habe, dass ich in "SomeFunc" einen doppelten Variablennamen hatte.
    MsgBox($MB_SYSTEMMODAL, $vReturn, "Die Variable hat sich jetzt geändert: " & $vVariableThatIsGlobal)
EndFunc   ;==>Example

Func SomeFunc()
    ; Dies sollte eine Variable im lokalen Bereich erstellen, wenn der Variablenname noch nicht vorhanden ist.
    ; Aus Gründen der Aussage habe ich völlig vergessen, dass ich bereits eine Variable mit demselben Namen deklariert habe.
    ; Nun, ich möchte nur, dass dies in der Funktion geändert wird und nicht in der Variablen oben im Skript.
    ; Sollte in Ordnung sein, oder? Denk nochmal.
    Dim $vVariableThatIsGlobal = ""

    For $i = 1 To 10
        $vVariableThatIsGlobal &= $i ; Dies gibt 12345678910 zurück und löscht den vorherigen Inhalt von $vVariableThatIsGlobal vollständig.
    Next
    Return $vVariableThatIsGlobal
EndFunc   ;==>SomeFunc