Arrays

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

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

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

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

; In das Array schreiben:
Loop, Read, %A_WinDir%\system.ini ; Jede Dateizeile nacheinander abrufen.
{
    Array.Push(A_LoopReadLine) ; Diese Zeile an das Array anfügen.
}

; Aus dem Array lesen:
; Loop % Array.MaxIndex()   ; Traditionellerer Ansatz.
for index, element in Array ; Enumeration ist meistens empfohlen.
{
    ; Mit "Loop" müssen die Indexe fortlaufende Nummern von 1 bis zur Anzahl
    ; der Elemente im Array sein (oder in der Schleife berechnet werden).
    ; MsgBox % "Elementnummer " . A_Index . " ist " . Array[A_Index]

    ; Mit "for" wird sowohl der Index (oder "Schlüssel") als auch dessen Wert
    ; bereitgestellt, wobei der Index ein *beliebiger* Wert sein kann.
    MsgBox % "Elementnummer " . index . " ist " . element
}

Dies zeigt nur einen kleinen Teil der Funktionalität von Objekten. Elemente können gesetzt, abgerufen, eingefügt, entfernt und enumeriert werden. Neben Zahlen können auch Zeichenketten und Objekte als Schlüssel verwendet werden. Objekte können als Werte in andere Objekte gespeichert und als Funktionsparameter oder Rückgabewerte übergeben werden. Außerdem können Objekte um neue Funktionalität erweitert werden.

Obwohl Push() und Enumeratoren durchaus ihre Vorteile haben, finden es manche 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 der Einfachheit halber eine Variable, kann aber mit Array.Anzahl := n in das Array selbst gespeichert oder mit Array.MaxIndex() ersetzt werden. Wenn ein anderer Startindex als 1 gewünscht ist, kann auch Array.MinIndex() verwendet werden.

Pseudo-Arrays

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

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

Neben Befehlen wie StringSplit und WinGet List, die Arrays erstellen, können auch Befehle verwendet werden, die eine Ausgabevariable akzeptieren oder einen Wert in eine Variable speichern, um ein Array zu erstellen. Das einfachste Beispiel ist der Zuweisungsoperator (:=), wie unten gezeigt:

Array%j% := A_LoopField

Es ist auch möglich, mehrdimensionale Arrays zu erstellen, indem ein beliebiges Trennzeichen zwischen den Indexen verwendet wird. Zum Beispiel:

Array%j%_%k% := A_LoopReadLine

Das folgende Beispiel zeigt, wie ein Array erstellt und darauf zugegriffen werden kann (in diesem Fall werden mehrere Namen aus einer Textdatei abgerufen):

; In das Array schreiben:
ArrayAnzahl := 0
Loop, Read, %A_WinDir%\system.ini   ; Jede Dateizeile nacheinander abrufen.
{
    ArrayAnzahl += 1  ; Speichern, wie viele Elemente im Array sind.
    Array%ArrayAnzahl% := A_LoopReadLine  ; Speichert diese Zeile in das nächste Array-Element.
}

; Aus dem Array lesen:
Loop %ArrayAnzahl%
{
    ; Die folgende Zeile verwendet ":=", um ein Array-Element abzurufen:
    Element := Array%A_Index%  ; A_Index ist eine interne Variable.
    ; Alternativ kann auch das "% "-Präfix verwendet werden, um MsgBox oder andere Befehle ausdrucksfähig zu machen:
    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 bzw. abgerufen werden können. Dies ist besonders dann nützlich, wenn Performanz und/oder Speicherverbrauch von entscheidender Bedeutung sind.