Reihungen = Arrays


Um einzelne Datenelemente zu größeren Einheiten zusammenzufassen, bieten Programmiersprachen unterschiedliche Mechanismen an; eine einfache Möglichkeit ist es, Reihungen (Folgen fester Länge) zu bilden, die man auch als Tabellen  interpretieren kann. Oft spricht man auch von Feldern  oder Vektoren , doch haben diese Bezeichnungen noch andere Bedeutungen, die hier nicht gemeint sind, und daher vermeiden wir sie hier.

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.

Beispiele:

	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
	
Ist der Elementtyp selbst ein Arraytyp, so erhält man mehrdimensionale Strukturen, beispielsweise Matrizen.

Beispiele:

	TYPE Kreuzung = ARRAY [1..4] OF ARRAY [Farbe] OF Zustand;
	VAR Kreuzung1: Kreuzung;

	Kreuzung1[3][rot] := an; 
	
Eine verkürzte Schreibweise ist zulässig und bequem:
	TYPE DreiDreiMatrix = ARRAY [1..3, 1..3] OF REAL;

	TYPE Kreuzung = ARRAY [1..4, Farbe] OF Zustand;

	Kreuzung1[3, rot] := an; 
	
Manchmal ist auch teilweise Indizierung  nützlich:
	Ampel3 := Kreuzung1[3];
	

zurück | Inhalt | Index | vor | Vorlesung

Klaus Lagally, 22. Februar 2000, 19:35