In Modula 2 (und Pascal und weiteren Sprachen) können wir neue Datentypen einführen durch eine Arrayvereinbarung der folgenden Art:
TYPE <T> = ARRAY [ <Indextyp> ] OF <Elementtyp>Dabei sind <Indextyp> und <Elementtyp> Bezeichnungen für bereits bekannte Datentypen. Ein Datenelement vom Typ <T> können wir als eine Tabelle auffassen, deren Zeilen mit Werten vom <Indextyp> "numeriert" sind und deren Einträge Werte vom <Elementtyp> sind; wir können sie als Wertetabelle einer Funktion des Typs [<Indextyp><Elementtyp>] deuten, doch steht dieser Aspekt meist nicht im Vordergrund.
Der <Indextyp> muß ein skalarer Typ sein, allerdings, aus Speicherplatzgründen, nicht INTEGER oder CARDINAL; also ein Bereichstyp oder ein Aufzählungstyp. Der <Elementtyp> ist (fast) ganz beliebig. Der Typ <T> heißt ein Arraytyp.
Eine Variable von einem Arraytyp <T> ist eine Arrayvariable, auf ihre Komponenten kann man durch Indizierung zugreifen: Ist <V> eine Variablenbenennung vom Arraytyp <T>, so benennt <V>[<I>] eine Variable vom <Elementtyp>. <I> ist dabei ein Wert vom <Indextyp>.
Warnung: Ein häufiger Programmierfehler besteht darin, mit dem Wert des Indexausdruckes <I> die Grenzen des Indextyps zu überschreiten. Dies kann vom Übersetzer nicht immer erkannt werden und führt zu unbeabsichtigten Speicherzugriffen auf andere Objekte, oft mit katastrophalen Folgen!
Leider bieten die meisten Programmiersprachen für Arraykonstanten keine bequeme Notation an; statt eines konstanten Array muß man dann eine Arrayvariable verwenden, deren Komponenten man einzeln vorbesetzt.
Ist der Elementtyp selbst ein Arraytyp, so erhält man mehrdimensionale Strukturen, beispielsweise Matrizen.TYPE Dreivektor = ARRAY [1..3] OF REAL; TYPE Farbe = (rot, gelb, gruen); TYPE Zustand = (aus, an); TYPE Ampel = ARRAY [Farbe] OF Zustand; VAR Ampel1, Ampel2, Ampel3, Ampel4: Ampel; Ampel1[rot] := an; Ampel1[gelb] := aus; Ampel1[gruen] := aus; IF Ampel1[gruen] = an THEN fahre ELSE warte END
Eine verkürzte Schreibweise ist zulässig und bequem:TYPE Kreuzung = ARRAY [1..4] OF ARRAY [Farbe] OF Zustand; VAR Kreuzung1: Kreuzung; Kreuzung1[3][rot] := an;
Manchmal ist auch teilweise Indizierung nützlich:TYPE DreiDreiMatrix = ARRAY [1..3, 1..3] OF REAL; TYPE Kreuzung = ARRAY [1..4, Farbe] OF Zustand; Kreuzung1[3, rot] := an;
Ampel3 := Kreuzung1[3];