'Echte' Arrays - Grundlagen
Posted: 13 Oct 2015, 06:54
Einführung:
Als 'Array' bezeichnet man im einfachsten Fall einen Speicherbereich, in dem mehrere gleichartige Werte (Elemente) direkt aufeinanderfolgend abgelegt sind. Der gesamte Bereich wird über einen Namen angesprochen. Die einzelnen Werte (Elemente) erreicht man über ihren Index, der die Position des Wertes innerhalb des Bereichs bestimmt. Dieser einfachste Fall ist in AHK bisher nicht realisiert worden. Für den Zugriff auf AHK Arrays sind diese Begriffe aber trotzdem zutreffend.
Im alten AHK 1.0 (AHK Basic) gab es nur die sogenannten 'Pseudo-Arrays'. Dafür wurden einzelne unabhängige Variablen verwendet, deren Namen aus einen gemeinsamen Teil und einer Art Pseudo-Index zusammengesetzt sind, so dass sie sich ähnlich wie ein Array ansprechen lassen. Ein Beispiel dafür ist die Ausgabe des Kommandos StringSplit, man kann sie aber auch händisch erstellen. Die Beispiele zu StringSplit zeigen das Prinzip:Der gemeinsame Namensteil (der Name des Arrays) ist hier FarbArray. Auf die einzelnen Arrayelemente wird in der Schleife durch Anhängen des Durchlaufzählers A_Index (der Pseudo-Index des Arrays) zugegriffen, der dafür in % Zeichen eingeschlossen werden muss: FarbArray%A_Index%. Wenn man einen bestimmten 'Index' nutzen will, kann man den auch direkt an den Arraynamen anhängen, z.B. FarbArray3 für das dritte Element. Für die Nutzung von Pseudo-Arrays finden sich in den Foren unzählige Beispiele.
Bereits im Vorgänger des aktuellen AHK 1.1 (damals AHK_L genannt) wurden zusätzlich 'echte' Arrays (bzw. Objekte, die sich wie echte Arrays nutzen lassen) eingeführt. Die Nähe zu den mysteriösen Objekten und der damit zusammenhängende Gebrauch von Bezeichnungen wir OOP (ObjektOrientierte Programmierung) scheint aber viele Anfänger abzuschrecken, weil sie glauben, dass das 'zu hoch' für sie sei. Ich will mit den folgenden Artikeln versuchen, diese Scheu etwas zu mindern.
Inhalt:
Als 'Array' bezeichnet man im einfachsten Fall einen Speicherbereich, in dem mehrere gleichartige Werte (Elemente) direkt aufeinanderfolgend abgelegt sind. Der gesamte Bereich wird über einen Namen angesprochen. Die einzelnen Werte (Elemente) erreicht man über ihren Index, der die Position des Wertes innerhalb des Bereichs bestimmt. Dieser einfachste Fall ist in AHK bisher nicht realisiert worden. Für den Zugriff auf AHK Arrays sind diese Begriffe aber trotzdem zutreffend.
Im alten AHK 1.0 (AHK Basic) gab es nur die sogenannten 'Pseudo-Arrays'. Dafür wurden einzelne unabhängige Variablen verwendet, deren Namen aus einen gemeinsamen Teil und einer Art Pseudo-Index zusammengesetzt sind, so dass sie sich ähnlich wie ein Array ansprechen lassen. Ein Beispiel dafür ist die Ausgabe des Kommandos StringSplit, man kann sie aber auch händisch erstellen. Die Beispiele zu StringSplit zeigen das Prinzip:
Code: Select all
Farben = rot,grün,blau
StringSplit, FarbArray, Farben, `,
Loop, %FarbArray0%
{
diese_Farbe := FarbArray%a_index%
MsgBox, Farbnummer %a_index% ist %diese_Farbe%.
}
Bereits im Vorgänger des aktuellen AHK 1.1 (damals AHK_L genannt) wurden zusätzlich 'echte' Arrays (bzw. Objekte, die sich wie echte Arrays nutzen lassen) eingeführt. Die Nähe zu den mysteriösen Objekten und der damit zusammenhängende Gebrauch von Bezeichnungen wir OOP (ObjektOrientierte Programmierung) scheint aber viele Anfänger abzuschrecken, weil sie glauben, dass das 'zu hoch' für sie sei. Ich will mit den folgenden Artikeln versuchen, diese Scheu etwas zu mindern.
Inhalt:
- 'Einfache' Arrays
- Assoziative Arrays
- Mehrdimensionale Arrays - Teil 1
- Mehrdimensionale Arrays - Teil 2
- Weitere Informationen
- Weil die innere Sruktur von Arrays und Objekten in AHK identisch ist (d.h. Arrays sind Objekte), gibt es verschiedene Möglichkeiten, um auf Arrays zuzugreifen. Man unterscheidet üblicherweise zwischen Array- und Objektsyntax. Das Merkmal der Arraysyntax sind die eckigen Klammern [...]. Ich werde diese Syntax verwenden, soweit es möglich ist. Die Objektsyntax verwendet stattdessen geschweifte Klammern {...} und den Punkt . als Trennzeichen zwischen Array/Objektnamen und Index/Schlüssel. Wer es möchte, kann z.B stattMeinArray[1] auch MeinArray.1 für den Zugriff auf das erste Element nutzen.
- Wer sich mit 'echten' Arrays abgibt, begibt sich automatisch in das Land der Ausdrücke. Deshalb sind bei der Programmierung immer deren Regeln zu beachten. Die Wichtigsten sind (wie ich glaube):
- Für die Zuweisung von Werten an oder aus Arrays muss anstelle des einfachen = Zeichens immer der Operator := verwendet werden.
- Beim Zugriff auf den Inhalt von Variablen wird der Name in der Regel nicht mit %-Zeichen eingeschlossen.
- Numerische Werte werden als Zahlen geschrieben.
- Nicht numerische Zeichenfolgen müssen in "-Zeichen eingeschlossen werden.
- Außerdem muss man immer im Hinterkopf behalten, dass die Variablen, die dem Array einen Namen geben, nicht die Daten des Arrays sondern nur eine Referenz / einen Verweis auf den Datenbereich enthalten. In Anweisungen wie MsgBox, %MeinArray% wird deshalb nichts (bzw. eine leere Zeichenfolge) ausgegeben.
Und eine Anweisung wie MeinArray := IrgendEinWert irgendwo im Skript sorgt dafür, dass sowohl der Verweis auf das Array überschrieben wird als auch das Array selbst zerstört bzw. freigegeben wird, wenn MeinArray zu diesem Zeitpunkt ein Array bezeichnet. Das Array ist damit unwiederbringlich futsch.