Array

aus RHWiki, der freien Romhacking-Enzyklopädie

Arrays (engl. für Feld) sind Speicherblöcke mit Anreihungen von Variablen gleichen Typs. Da die Variablen somit alle die selbe Größe haben und keine Zwischenräume existieren, sind Arrays indizierbar, d.h. man kann durch Angabe eines Indexes direkt die Daten an diesem Index des Arrays zugreifen. (siehe weiter unten bei Details)

Beispiel:

Im Speicher liegen nacheinander folgende Werte:

67 89 36 52 78 84 59 | Wert (dezimal)
 0  1  2  3  4  5  6 | Index

(Anmerkung: Hier ist der erste Index 0. Das muss aber nicht immer so sein.
 Sprachen wie (V)Basic erlauben eine freie Angabe des ersten Indexes,
 sodass dieser auch z.B. -7 sein könnte.)

Indizes der Felder werden in Programmiersprachen ganz unterschiedlich referenziert (zugegriffen): In C(++) und Pascal verwendet man eckige Klammern. In Basic dagegen runde Klammern.

Beispiel: (Wir nehmen das Array von oben und nennen es "MeinFeld")
Dann erhält man die Elemente des Feldes so:

cout << MeinFeld [0] // Ausgabe: 67
cout << MeinFeld [1] // Ausgabe: 89
...
cout << MeinFeld [6] // Ausgabe: 59

(Hier C++-Syntax)
Inhaltsverzeichnis

Vorteil von Arrays

Arrays sind immer da sinnvoll, wo man viele Daten gleichen Typs hat, also z.B. einen Stapel Telefonnummern oder auch einen Stapel Bücher (wobei man Buch dann definieren müsste...).

Arrays sind viel einfacher als wenn man z.B. für jede Telefonnummer eine eigene Variable definieren würde, da mann ein ganzes Feld auf einmal definieren und den Index auch berechnen kann (was man bei einzelnen Variablen nicht könnte).

Beispiel:
Man hat ganz viele Nummern 0..99999

Mit einzelnen Variablen:
Var0 = 0 ; Var1 = 1 ; Var2 = 2 ; Var3 = 3 ; Var4 = 4 ; ... ; Var99999 = 99999
Das so zu schreiben ist kompletter Unfug.

Einfacher geht es so: (Pseudocode mit Schleife)

Definiere Nummer [0...99999] (Achtung: es wird erstmal nur die Größe
                              des Feldes definiert und nicht der Inhalt!
                              Dies wäre in C jedoch auch möglich.)
Für N von 0 bis 99999:
   Nummer [N] = N
Nächstes N

Nachteil ist, dass Arrays wenig flexibel sind, d.h. man kann (wenn überhaupt) die Größe nur mit Aufwand ändern, man kann auch aus der Mitte keine Elemente 'rausnehmen'/hinzufügen und die anderen dann 'nachrücken' lassen.

Wollte man sowas haben, sollte man Listen verwenden, die auf Zeigern basieren.

Ein dynamisches Array, dessen Größe sich auch zur Laufzeit noch ändern lässt, erhält man in einigen Programmiersprachen mit dem Datentyp Vector.

Technische Details

Die Indizierung eines Array lässt sich zurückführen auf eine einfache Berechnung:

Zieladresse = Adresse_Erster_Indexes + [(Index - Erster_Index) * Größe_pro_Eintrag]

Umsetzung in Assembler

In Assembler lässt sich ein Arrayzugriff ganz unterschiedlich realisieren, je nachdem für welches System man programmiert:

;Beispiel: x86
;Das Feld beginnt bei [Basisadresse] und jeder Index hat 4 Bytes

MOV esi, Basisadresse
MOV eax, Index
MOV eax, DWORD PTR [4 * eax + esi]

;Der Wert von Index ist dann in eax
;Beispiel: THUMB

LDR r0, Basisadresse
LDR r1, Index
LSL r1, #0x2           ;Linksshift um 2 gleichwertig mit Multiplikation mit 4
LDR r0, [r0, r1]
;Der Wert von Index wird in r0 zurückgegeben.

Siehe auch

'Persönliche Werkzeuge