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.

