Sprachreferenz - Variablen

Eine Variable ist lediglich ein Ort, an dem Daten im Speicher des Rechners abgelegt werden, so dass schnell auf sie zugegriffen werden kann. Man kann sie sich wie ein Postfach im Speicher vorstellen, in das man Informationen hineinlegen oder aus dem man Informationen herausnehmen kann. Man kann zum Beispiel eine Variable erstellen, um eine Zahl, eine Zeichenkette, die Antwort eines Benutzers auf eine Frage oder das Ergebnis einer mathematischen Gleichung zu speichern.

Jede Variable hat einen Namen (wieder vergleichbar mit einem Postfach), muss mit dem Zeichen $ beginnen und darf nur Buchstaben, Ziffern und den Unterstrich _ enthalten. Hier einige Beispielnamen:

    $Var1

    $vVariable

    $my_Variable


Hinweis : Bei Variablennamen wird die Groß-/Kleinschreibung nicht berücksichtigt: MyVariable() ist dasselbe wie MyvARiAblE()

Jede Variable wird als Datentyp Variant gespeichert.

Um die Pflege des Skripts zu erleichtern wird vorgeschlagen, eine Standardkonvention für die Benennung von Variablen zu verwenden.

Deklaration von Variablen

Variablen werden deklariert und erstellt mit dem Schlüsselwort Local und Global - Dim kann auch verwendet werden, obwohl dies nicht empfohlen wird bzw. als veraltet gilt.

@@SyntaxHighlighting@@ Local $vVariable @@End@@

Man kann mehrere Variablen auf einmal deklarieren:

@@SyntaxHighlighting@@ Global $vVariable1, $vVariable2 @@End@@

Man kann einer Variable auch ohne Deklaration einen Wert zuweisen, aber viele bevorzugen die explizite Deklaration.

@@SyntaxHighlighting@@ $vVariable = "Erstellen und Zuweisen" @@End@@

Deklaration von Konstanten

Konstanten werden mit dem Schlüsselwort Const deklariert und müssen mit einem Wert initialisiert werden:

@@SyntaxHighlighting@@ Const $iConst1 = 1, $iConst2 = 12 @@End@@

Konstanten können auch mit dem Schlüsselwort Enum deklariert und initialisiert werden:

@@SyntaxHighlighting@@ Enum $eConst1 = 1, $eConst2, $eConst3 ; 1, 2, 3 Enum Step 2 $eIncr0, $eIncr2, $eIncr4 ; 0, 2, 4 Enum Step *2 $eMult1, $eMult2, $eMult4 ; 1, 2, 4 @@End@@

Sobald einer Konstante ein Wert zugewiesen wurde, kann dieser im weiteren Verlauf des Skriptes nicht mehr geändert werden.

Gültigkeitsbereich (Scope)

Der Gültigkeitsbereich einer Variablen wird dadurch festgelegt, wann und wie die Variable deklariert wird. Wird eine Variable am Anfang des Skripts und außerhalb von Funktionen deklariert, existiert sie im globalen Gültigkeitsbereich und kann von überall im Skript gelesen oder geändert werden.

Wenn eine Variable innerhalb einer Funktion deklariert wird, befindet sie sich im lokalen Gültigkeitsbereich und kann nur innerhalb der selben Funktion verwendet werden. Variablen, die innerhalb von Funktionen erzeugt werden, werden automatisch zerstört, wenn die Funktion endet.

Wenn Variablen mit Dim deklariert oder in einer Funktion zugewiesen werden, haben sie standardmäßig einen lokalen Gültigkeitsbereich es sei denn, es gibt eine globale Variable mit demselben Namen (in diesem Fall wird die globale Variable wiederverwendet). Dies kann mit den Schlüsselwörtern Lokal und Global geändert werden, um den gewünschten Gültigkeitsbereich zu erzwingen.

Siehe Static für Details zur Verwendung dieses Schlüsselworts als Teil der Gültigkeitsbereich-Deklaration.

Arrays und Maps

AutoIt verfügt über 2 Arten von Datensammlungsvariablen (Collections): Arrays und Maps.

Arrays sind viel schneller beim willkürlichen Zugriff und können mehrere Dimensionen haben - eine Dimensionsgröße ist auf den anfänglich deklarierten Wert festgelegt (obwohl sie mit ReDim geändert werden kann). Arrays werden mit Integer-Werten indiziert, die sich auf die Reihenfolge der Elemente beziehen und bei Element[0] beginnen - Elemente können über den Integer-Index ausgelesen, oder durch eine einfache For...Next-Schleife iteriert werden.

Maps sind besser für den Zugriff auf Datensätze/Wörterbücher geeignet und haben nur eine Dimension. Sie werden entweder mit Integer- oder String-Schlüsseln indiziert (Integer beziehen sich nicht auf die Reihenfolge der Elemente) und werden dynamisch in der Größe angepasst, sobald Werte hinzugefügt oder entfernt werden. Auf einen Wert kann nur mit dem ursprünglichen Schlüssel zugegriffen werden - diese Schlüssel können mit der Funktion MapKeys iteriert werden.

Arrays

Ein Array ist eine Variable, die eine Reihe von Datenelementen enthält. Auf jedes Element in dieser Variablen kann über eine Indexnummer zugegriffen werden, die sich auf die Position des Elements innerhalb des Arrays bezieht - in AutoIt ist das erste Element eines Arrays immer Element [0]. Array-Elemente werden in einer definierten Reihenfolge gespeichert und können sortiert werden.

Das Füllen der [ ] mit einer Dimensionsgröße deklariert ein Array:

@@SyntaxHighlighting@@ Local $aVar[3] ; ein Array @@End@@

Die Zuweisung von Elementwerten bei der Deklaration macht die Variable zu einem Array - diese drei Zeilen sind funktional gleichwertig:

@@SyntaxHighlighting@@ Local $vVar[3] = [1, 2, 3] ; ein Array Local $vVar[] = [1, 2, 3] ; ein Array Local $vVar = [1, 2, 3] ; ein Array @@End@@
Ein Beispiel:

Man möchte eine Liste von Namen speichern: "Jasper", "Beethoven", "Pinky" und "Fidget". Dafür könnte man vier separate Variablen nutzen, aber die Verwendung eines Array ist effizienter:

@@SyntaxHighlighting@@ Local $aArray[4] $aArray[0] = "Jasper" $aArray[1] = "Beethoven" $aArray[2] = "Pinky" $aArray[3] = "Fidget" @@End@@

Um auf einen bestimmten Wert in einem Array zuzugreifen, verwendet man die Indexnummer:

@@SyntaxHighlighting@@ $sString = $aArray[2] ; $sString enthält "Pinky" @@End@@

Die Indexnummer kann auch durch eine andere Variable oder einen Ausdruck ersetzt werden, so dass man komplexe Möglichkeiten für die Zuweisung oder den Zugriff auf Elemente in einem Array erstellen kann.

Die Elemente eines ganzen Arrays können mit einer For...Next-Schleife iteriert (durchlaufen) werden:

@@SyntaxHighlighting@@ ; UBound liefert die Gesamtzahl der Elemente zurück - da das erste [0] ist, ist der höchste Index um eins kleiner For $i = 0 To UBound($aArray) - 1 ConsoleWrite(aArray[$i] & @CRLF) Next @@End@@
Arrays können auch mehrdimensional sein, wenn man mehrere Serien von Indexnummern verwendet.  Man stelle sich Zeilen und Spalten in einem Tabellengitter vor: @@SyntaxHighlighting@@ $aArray[0][0] = "Oben-links" $aArray[1][0] = "Unten-links" $aArray[0][1] = "Oben-rechts" $aArray[1][1] = "Unten-rechts" @@End@@

(Diese Werte sind nur Beispiele)

Es können bis zu 64 Dimensionen in einem Array verwendet werden. Die Gesamtzahl der Einträge darf nicht größer als 2^24 (16 777 216) sein.

Arrays müssen vor der Verwendung deklariert werden, indem ihr Gültigkeitsbereich mit den Schlüsselwörtern 'Global/Local/Static' festgelegt wird. Zudem muss entweder die Größe angegeben und/oder Elemente zugewiesen werden.

@@SyntaxHighlighting@@ Local $aArray1[2] ; Array mit 2 Elementen, keine Zuweisung erfolgt Local $aArray[] = [8, 4, 5, 9, 1] ; Array mit 5 Elementen, alle zugewiesen Local $aArray[7] = [3, 7.5, "string"] ; Array mit 7 Elementen, nur die ersten 3 werden zugeordnet @@End@@

Datentypen in Arrays

Ein Array-Element kann jeden AutoIt-Datentyp enthalten:

@@SyntaxHighlighting@@ $aArray[0] = 1 $aArray[1] = True $aArray[2] = "Text" $aArray[3] = $aAnotherArray @@End@@

Auf ein Array, das innerhalb eines anderen Arrays abgelegt wird, kann direkt zugegriffen werden, aber diese Methode ist etwas langsamer als der Zugriff auf andere Datentypen:

@@SyntaxHighlighting@@ Local $aInternal[3] = ["A", "B", "C"] ; Deklarieren eines Arrays Local $aContainer[1] = [$aInternal] ; Deklarieren eines Container-Arrays, welches das erste Array enthält $sString = ($aContainer[0])[1] ; $sString enthält "B" ; Man beachte die Anforderung, die Definition des ersten Array-Elements in ( ) zu setzen @@End@@

Maps

Diese Funktion ist experimentell. Es kann sein, dass sie nicht funktioniert oder Fehler enthält. Außerdem kann es sein, dass sie ohne Hinweis geändert oder entfernt wird..

BITTE KEINE FEHLER ODER NEUE GEWÜNSCHTE FEATURE FÜR DIE FUNKTION MELDEN.

Eine Map ist eine Variable, die eine Reihe von Datenelementen enthält, die jeweils aus einer Schlüssel/Wertpaarung bestehen. Auf ein Element kann nur über einen Schlüssel zugegriffen werden, der entweder eine Zeichenkette oder eine ganze Zahl sein kann. Ein Integer-Schlüssel bezieht sich jedoch nicht auf die Position des Elements innerhalb der Map - diese stehen in keiner definierten Reihenfolge und können nicht sortiert werden. Bei String-Schlüsseln wird, nahezu einmalig in AutoIt, zwischen Groß- und Kleinschreibung unterschieden - "MyKey" ist nicht dasselbe wie "mykey".

Die Verwendung von leeren [ ] deklariert eine Map:

@@SyntaxHighlighting@@ Local $mVar[] ; Eine Map @@End@@
Ein Beispiel:

Man möchte eine Anzahl von Variablen in einer Map speichern, um sie als einen einzigen Parameter an eine Funktion zu übergeben. Die Verwendung einer Map ermöglicht es, mit Hilfe von String-Schlüsseln einen leicht verständlichen Verweis auf den enthaltenen Wert zu erstellen - wie z.B. die ControlIDs einer Reihe von Steuerelementen, die durch ihre Namen indiziert werden. Man beachte, dass Elemente entweder durch [] oder die Punktnotation adressiert werden können:

@@SyntaxHighlighting@@ Local $mControls[] $mControls["Input"] = GUICtrlCreateInput(....) $mControls.Combo = GUICtrlCreateCombo(...) $mControls["Button"] = GUICtrlCreateButton(...) @@End@@

Um auf einen bestimmten Wert in einer Map zuzugreifen, verwendet man den Schlüssel - auch hier können beide Schreibweisen verwendet werden, müssen es aber zunächst nicht:

@@SyntaxHighlighting@@ $idControlID = $mMap.Input ; Variable enthält die ControlID für die Eingabe $idControlID = $mMap["Combo"] ; Variable enthält die ControlID für die Combo @@End@@

Integer-Schlüssel müssen die []-Notation verwenden und sind nicht dasselbe wie ihr String-Äquivalent:

@@SyntaxHighlighting@@ $mMap[3] = "Integer 3" ; dies sind separate Schlüssel $mMap["3"] = "String 3" @@End@@

Maps müssen vor der Verwendung deklariert werden, indem ihr Gültigkeitsbereich mit den Schlüsselwörtern 'Global/Local/Static' festgelegt wird.

@@SyntaxHighlighting@@ Local $mControls[] @@End@@

Datentypen in Maps

Ein Map-Element kann jeden AutoIt-Datentyp enthalten:

@@SyntaxHighlighting@@ $mMap["Integer"] = 1 $mMap.Boolean = True $mMap["String"] = "Text" $mMap.Array = $aArray $mMap["Map"] = $mAnotherMap @@End@@

Auf eine interne Map kann direkt zugegriffen werden:

@@SyntaxHighlighting@@ Local $mInternal[] ; Deklarieren einer Map $mInternal["Internal"] = "AutoIt3" ; Zuweisung eines Wertes Local $mContainer[] ; Deklarieren einer Container-Map $mContainer.Bin = $mInternal ; die erste Map als Element zuweisen ; Alle diese Zuweisungen geben "AutoIt3" zurück $sString = $mContainer["Bin"]["Internal"] $sString = $mContainer.Bin.Internal $sString = $mContainer["Bin"].Internal $sString = $mContainer.Bin["Internal"] @@End@@

Variablennamen

Die in AutoIt verwendete Namenskonvention für Variablen basiert auf der ungarischen Notation. Das Präfix definiert den logischen Datentyp, nicht den physikalischen: Es gibt somit einen Hinweis darauf, welchen Zweck die Variable hat bzw. was sie repräsentiert. Das Präfix kodiert nicht den tatsächlichen Datentyp: Dies geschieht bei der Zuweisung. Siehe die unten aufgeführte Tabelle für akzeptierte Standards.

Präfix umfasst den Datentyp Beispiel
a Arrays $aArray[0]
b Booleans (boolesche Werte) $bBool = True
d Binaries $dBinary = Binary("0x80000000")
e Konstante Variablen Local Const $eEulersConstant = 2.7182818284590452
f Fließkommazahlen $fFloat = 0.123
h Handles (und GUI Handles) $hGUI = GUICreate("My GUI")
i Integer $iInteger = 10
id eine AutoIt ControlID $idButton_Ok = GUICtrlCreateButton("OK", 5, 5)
m Maps $mMap[]
n Zahlen im Allgemeinen (keine Präferenz) $nNumber = 0
o Objekte $oShell = ObjCreate("shell.application")
p Zeiger (Pointer) $pRect = DllStructGetPtr($tRECT)
s Zeichenketten (und Zeichen) $sString = "Hallo Welt"
t Strukturen $tSTRUCT = DllStructCreate($tagSTRUCT)
tag Definition von Strukturen $tagDATE = "struct; word Year;word Month;word Day; endstruct"
v Variant $vData = ClipGet()

Variablen werden nach folgendem Muster benannt:

Dollar Präfix Typ (in Kleinschrift) [optional] Untertyp (in Kleinschrift) Var Name (erster Buchstabe in Großschrift)
$ a h Handle

Beispiele:

@@SyntaxHighlighting@@ ; Weist einer lokalen Variablen die ganze Zahl 7 zu $iWeekDays = 7 ; Weist einer lokalen Variablen den wert von Pi zu $fPi = 3.14159265358979 ; Weist einer lokalen Variablen ein Array mit Strings zu Local $asArray[7] = ["mon", "tue", "wed", "thu", "fri", "sat", "sun"] ; Weist einer lokalen Variablen ein Array mit Zahlrn zu Local $anArray[4] = [0, 0.25, 3 / 4, 12] @@End@@

Initialisierung von Variablen

Bei der Initialisierung von Variablen gibt es mehrere Punkte zu beachten. Es ist keine gute Praxis, durch Zuweisung von Daten, die nicht sofort benötigt werden, Speicher zu belegen. Es wird daher empfohlen, Variablen erst unmittelbar vor ihrer Verwendung zu deklarieren und zu initialisieren. Wenn man einer Variablen einen Standardwert zuweisen möchte, den man später überschreiben will, dann sollten die Daten vom gleichen (oder der naheliegendsten Darstellung ihres) Typs sein und so wenig Speicher wie möglich verbrauchen.

Beispiele:

@@SyntaxHighlighting@@ ; Inkonsistente Datentypen werden als schlecht angesehen Local $iInteger = "0" Local $sString = False ; Richtige Initialisierung Local $iInteger = 0 Local $sString = "" @@End@@


In der folgenden Tabelle sind für jeden Datentyp empfohlene Standardwerte angegeben. Einige Datentypen haben mehr als einen möglichen Standardwert, der für die Initialisierung verwendet werden kann.

Standardwert umfasst die Datentypen
Binary("") $d
"" $s, $v
0 $a, $h, $i, $id, $m, $n, $o, $p, $t, $tag, $v
0.0 $f
Null $o, $s, $v
False (oder True) $b


Beispiel:

@@SyntaxHighlighting@@ ; Deklariert und initialisiert eine Variable mit dem empfohlenen Standardwert Local $vUndefined = Null ; Einige Zeit später $vUndefined = 0xB0AD1CEA ; Bei Bedarf einen geeigneten Wert zuweisen @@End@@

Um den Platzbedarf zu reduzieren, können mehrere Variablen in einer Zeile deklariert werden. Bei der Deklaration mehrerer Variablen in einer Zeile ist es generell empfehlenswert, sich an die Deklaration eines Datentyps pro Zeile zu halten. Die Absicht hierbei ist, den Code in Zukunft leichter nachvollziehbar und überschaubar zu machen, jedoch kann selbst das beste Layout je nach den Gegebenheiten variieren.

Beispiel:

@@SyntaxHighlighting@@ ; Nicht empfohlen Local $sString = "", $iInteger = 0, $asArray = ["a","b","c"] ; Gemischte Datentypen ; Empfohlen Local $iLeft = 10, $iTop = 10 ; Integer Local $idButton_Go = GUICtrlCreateButton("Go", $iLeft, $iTop) ; ControlIds Local $idButton_Quit = GUICtrlCreateButton("Quit", 50, 10) ; ControlIds @@End@@

In einigen Sprachen ist es zwingend erforderlich, Variablen bei der Deklaration zu initialisieren. Bei AutoIt ist dies jedoch nicht der Fall. Bezüglich des Datentyps sollten Variablen, die deklariert werden ohne sie zu initialisieren, als undefiniert betrachtet werden.

Gültigkeitsbereiche von Variablen (Scopes)

Variablen sollten auch entsprechend ihres Gültigkeitsbereichs (Scope) benannt werden.

Globale UDF Variable Globale Variable Lokale Variable
$__g_iSomeVar $g_iSomeVar $iSomeVar

Mit dieser Methode vermeiden Sie unerwünschte Neuzuweisungen.