Arrays

In AutoHotkey gibt es zwei verschiedene Typen von Dingen, die etwas mit Arrays zu tun haben:

Hinweis: Die folgenden Code-Beispiele zeigen verschiedene Ansätze, die zum gleichen Endergebnis führen.

Objekt-basierende Arrays [AHK_L 31+]

Solche Arrays können assoziative Arrays oder einfache Arrays sein. Assoziative Arrays werden mit der Object-Funktion oder mit geschweiften Klammern erstellt, während einfache Arrays mit der Array-Funktion oder mit eckigen Klammern erstellt werden. Weitere Informationen finden Sie unter AutoHotkey Anfänger-Tutorial oder Objekte.

Das folgende Beispiel zeigt die Verwendung eines einfachen Arrays:

; Erstellt ein Array, das zunächst leer ist:
Array := [] ; oder Array := Array()

; Schreibt in das Array:
Loop, Read, %A_WinDir%\system.ini ; Diese Schleife ruft jede Zeile der Datei einzeln ab.
{
    Array.Push(A_LoopReadLine) ; Fügt diese Zeile ans Array an.
}

; Liest vom Array:
; Loop % Array.MaxIndex()   ; Traditionellerer Ansatz.
for index, element in Array ; Enumeration ist in den meisten Fällen empfohlen.
{
    ; Beim Verwenden von "Loop" müssen die Indexe fortlaufende Nummern von 1 bis zur Anzahl
    ; der Elemente im Array sein (oder sie müssen innerhalb der Schleife berechnet werden).
    ; MsgBox % "Elementnummer " . A_Index . " ist " . Array[A_Index]

    ; Beim Verwenden von "for" werden sowohl der Index (oder "Key") als auch dessen Wert
    ; bereitgestellt, wobei der Index ein *beliebiger* Wert sein kann.
    MsgBox % "Elementnummer " . index . " ist " . element
}

Damit wird nur ein kleiner Teil der Objekt-Funktionalität angezeigt. Elemente können gesetzt, abgerufen, eingefügt, entfernt und enumeriert werden. Neben Zahlen können auch Zeichenketten und Objekte als Keys verwendet werden. Objekte können als Werte in andere Objekte gespeichert und als Funktionsparameter oder Rückgabewerte übergeben werden. Zudem können Objekte mit neuer Funktionalität erweitert werden.

Obwohl Push() und Enumeratoren ihren Nutzen haben, finden es einige Benutzer einfacher, den traditionelleren Ansatz zu verwenden (die auskommentierten Zeilen sind die entsprechenden Counterparts, die die unten beschriebenen Pseudo-Arrays verwenden):

  ; Jedes Array muss vorher initialisiert werden:
  Array := []

; Array%j% := A_LoopField
  Array[j] := A_LoopField

; Array%j%_%k% := A_LoopReadLine
  Array[j, k] := A_LoopReadLine

  ArrayAnzahl := 0
  Loop, Read, %A_WinDir%\system.ini
  {
      ArrayAnzahl += 1
    ; Array%ArrayAnzahl% := A_LoopReadLine
      Array[ArrayAnzahl] := A_LoopReadLine
  }

  Loop %ArrayAnzahl%
  {
    ; Element := Array%A_Index%
      Element := Array[A_Index]
    ; MsgBox % "Elementnummer " . A_Index . " ist " . Array%A_Index%
      MsgBox % "Elementnummer " . A_Index . " ist " . Array[A_Index]
  }

ArrayAnzahl bleibt aus Bequemlichkeit eine Variable, die aber mit Array.Anzahl := n in das Array selbst gespeichert oder mit Array.MaxIndex() ersetzt werden kann. Falls der Index nicht mit 1 beginnen soll, dann könnte auch Array.MinIndex() verwendet werden.

Pseudo-Arrays

Hinweis: Verwenden Sie nach Möglichkeit immer das oben erwähnte Objekt-basierende Array. Es ist einem Pseudo-Array in fast allen Aspekten überlegen: Es ist platzsparend, flexibler, übersichtlicher und ähnelt vielen anderen Programmiersprachen.

Pseudo-Arrays sind meistens konzeptionell: Jedes Array ist eigentlich nur eine Sammlung von durchnummerierten Variablen oder Funktionen, die als Elemente des Arrays wahrgenommen werden. In AutoHotkey werden diese Elemente in keiner Weise miteinander verknüpft.

Zusätzlich zu Befehlen wie StringSplit und WinGet List, die Arrays erstellen, können auch Befehle zur Erstellung eines Arrays verwendet werden, die eine Ausgabevariable akzeptieren oder einen Wert in eine Variable speichern. Das einfachste Beispiel dafür ist der Zuweisungsoperator (:=), wie unten dargestellt:

Array%j% := A_LoopField

Außerdem sind auch mehrdimensionale Arrays möglich, indem ein beliebiges Trennzeichen zwischen den Indexen verwendet wird. Zum Beispiel:

Array%j%_%k% := A_LoopReadLine

Das folgende Beispiel verdeutlicht, wie ein Array erstellt und auf ihm zugegriffen werden kann. In diesem Fall werden mehrere Namen aus einer Textdatei abgerufen:

; Schreibt in das Array:
ArrayAnzahl := 0
Loop, Read, %A_WinDir%\system.ini   ; Diese Schleife ruft jede Zeile der Datei einzeln ab.
{
    ArrayAnzahl += 1  ; Behält im Blick, wie viele Elemente im Array sind.
    Array%ArrayAnzahl% := A_LoopReadLine  ; Speichert diese Zeile ins nächste Array-Element.
}

; Liest vom Array:
Loop %ArrayAnzahl%
{
    ; Die folgende Zeile verwendet den ":="- Operator, um ein Array-Element abzurufen:
    Element := Array%A_Index%  ; A_Index ist eine interne Variable.
    ; Alternativ kann auch der "%"-Präfix verwendet werden, damit ein MsgBox oder andere Befehle ausdrucksfähig sind:
    MsgBox % "Elementnummer" . A_Index . " ist " . Array%A_Index%
}

Ein ähnliches Konzept wird mit NumPut() und NumGet() erreicht, mit denen mehrere Zahlen im Binärformat gespeichert oder abgerufen werden können. Das ist besonders hilfreich, falls die Leistung und/oder Speicherauslastung von entscheidender Bedeutung sind.