4. Typen und Datenstrukturen
 
zurück
4.3.2.1 Reihungstypen (Arrays)


Ein Reihungstyp ist ein zusammengesetztes Objekt. Es enthält eine Gruppe von Komponenten, die alle vom gleichen Typ sind. Die Anzahl der Indizes entspricht der Dimension des Reihungstyps. Die Indexwerte einer Dimension müssen alle zum gleichen Indextyp gehören. Indextypen müssen diskrete Typen sein, d. h. es können ganzzahlige oder Aufzählungstypen sein. Die Indextypen verschiedener Dimensionen eines Reihungstyps können unterschiedlich sein.

Alle Objekte eines Reihungstyps haben einige gemeinsame Charakteristika:
  • Typ der Komponenten
  • Anzahl der Dimension
  • Typen der Indexwerte der Dimensiom
Es gibt zwei Klassen von Reihungstypen (array_type_definition <BNF>):


Bingeschränkte Reihungstypen

Bei einem eingeschränkten Reihungstyp (constrained_array_definition <BNF>) sind die Bereiche (die oberen und unteren Grenzen) aller Objekte des Typs gleich. Damit haben alle Objekte eines solchen Typs die gleiche Größe.

Zwei Beispiele für eingeschränkte Reihungstypen seien

type Ortsvektor is array(1 .. 3) of Float;
type Drehmatrix is array(1 .. 3, 1 .. 3) of Float range -1.0 .. 1.0;


Wie die Deklaration von Drehmatrix zeigt, kann der Wertebereich der Komponenten in der Reihungstypdeklaration eingeschränkt werden. So sind für die neun Komponenten von Objekten des Typs Drehmatrix nur Werte im Bereich von -1.0 bis 1.0 zulässig. Die Art dieser Einschränkung hängt von der Typklasse der Komponente ab. Bei diskreten Typen können nur Bereichseinschränkungen angegeben werden, bei Gleitpunktkomponenten können auch Genauigkeitseinschränkungen erfolgen.

Den Gebrauch von Aufzählungstypen als Indextyp zeigt das folgende Beispiel.

type Schultag is (Montag, Dienstag, Mittwoch, Donnerstag, Freitag, Samstag);

type Fach is (Englisch, Franzoesisch, Deutsch,Mathe, Physik, Chemie,
 Biologie, Informatik, Geschichte, Sport, Musik, Frei);

subtype Schulstunden is positive range 1 .. 8;

type Stundenplan is array (Schultag, Schulstunden) of Fach;


Ein Objekt dieses Typs kann mit Vorbesetzung wie folgt deklariert werden:


Stundenplan_95_Klasse_10 : Stundenplan :=
Montag => (1 .. 2 => Englisch, 3 .. 4 => Mathe,
     5 .. 6 => Physik, others => frei),
Dienstag => (1 .. 2 => Franzoesisch, 3 .. 4 => Biologie,
     5 .. 6 => Deutsch, others => frei),
Mittwoch => (1 .. 2 => Informatik, 3 .. 4 => Chemie,
     5 .. 6 => Sport, others => frei),
Donnerstag => (1 .. 2 => Englisch, 3 .. 4 => Geschichte,
     5 => Musik, 6 => Informatik,
     others => frei),      
Freitag => (1 => Biologie, 2 => Chemie,
     3 | 4 => Mathe, 5 | 6 => Physik,
     others => frei),      
others => (others => frei));          

Der Zugriff auf einzelne Schulstunden erfolgt so:

Stundenplan_95_Klasse_10(Samstag,3) := Sport;

for Tag in Stundenplan'range(1) loop
   for Stunde in Stundenplan'range(2) loop
      ada.text_io.put(Schultag'image(Tag));
      ada.text_io.set_col(Schultag'width + 1);
      ada.text_io.put(Schulstunden'image(Stunde) & ": ");
      ada.text_io.put_line(Fach'image(Stundenplan_95_Klasse_10(Tag,Stunde)));
   end loop;
end loop;



Unbeschränkter Reihungstyp

Bei einem uneingeschränkten Reihungstyp (unconstrained_array_definition <BNF>) können verschiedene Reihungsobjekte unterschiedliche Grenzen haben. Die Indextypen der Dimensionen sind für alle Objekte des Typs gleich, aber verschiedene Reihungsobjekte können Indexwerte unterschiedlicher Unterbereiche für den Indexwert einer Dimension haben. (Hat z. B. die Typdefinition eine Dimension durch einen uneingeschränkten Bereich mit dem Typ Integer definiert, so können Objekte mit Indexwerten vom Typ Integer, Natural, Positive oder selbstdefinierten Untertypen von Integer deklariert werden.) Somit können Objekte uneingeschränkter Reihungstypen unterschiedliche Größe haben. Es ist aber möglich, allgemeinverwendbare Unterprogramme für die Objekte eines uneingeschränkten Reihungstyps zu schreiben.

Die folgenden Deklarationen legen zwei uneingeschränkte Reihungstypen fest.

type vector is array (integer range <>) of float;
type matrix is array (integer range <>, integer range <>) of float;


Vector ist ein eindimensionaler, Matrix ein zweidimensionaler Reihungstyp. Bei der Objektvereinbarung müssen die Bereichsgrenzen angegeben werden, z. B:

x : vector(1 .. 4);
A : matrix_typ(1 .. n, 1 .. n);
B : matrix_typ(1 .. n, 1 .. p);


Verschiedene Objekte eines uneingeschränkten Reihungstyps können eine unterschiedliche Anzahl von Elementen haben.
Die Bereichgrenzen eines Reihungsobjektes kann auch durch Initialiserung festgelegt werden:

y: vector := (1.2, 2.5, -0.5);

M: matrix_typ := Transform_Matrix (Matrix => B);

Die Größe des Aggregates legt die Länge des als Konstante vereinbarten Reihungsobjektes fest

In Ada 83 kann diese Art der Initialisierung nur für als Konstante vereinbarte Reihungsobjekte angewandt werden:

V: constant vector := (1.0, 2.0, 1.5, 4.0, 3.3);


Für uneingeschränkte Reihungstypen können allgemeine Funktionen und Prozeduren geschrieben werden, die auf alle Objekte der Typen anwendbar sind. So können Bibliothekspakete mit Operatoren für Matrixoperationen oder die Verknüpfung von Matrizen und Vektoren geschrieben werden. Solche Funktionen können dann nicht auf Typen wie Ortsvektor und Drehmatrix angewendet werden, da diese eigenständige Typen sind. Deshalb wäre eine Benutzung von Untertypen unter diesem Gesichtspunkt der Typkompatibilität sinnvoll. Das erhöht die Wiederverwendbarkeit.

subtype Ein_Ortsvektor is vector(1 .. 3);
subtype Eine_Drehmatrix is matrix(1 .. 3, 1 .. 3);



Die vordefinierten String-Typen

Zeichenketten werden in Ada durch verschiedene String-Typen dargestellt, die als zusammengesetzte Typen mit Komponenten der zwei Typen Character und Wide_Character
definiert sind.

Im Paket Standard sind die Typen String und Wide_String als eindimensionale Reihungstypen definiert gemäß:

type String is array(Positive range <>) of Character;


In einer Reihungstypdeklaration mit mehreren Dimensionen dürfen eingeschränkte und uneingeschränkte Indextypen nicht gleichzeitig auftreten.

Die folgende Deklaration ist daher unzulässig:

type Buchstaben_Felder is array (Character Range 'A' .. 'Z', Integer Range <>) of Integer;


Während bei der Deklaration von Objekten uneingeschränkter Reihungstypen für alle vorhandenen Dimensionen Indexeinschränkungen angegeben werden müssen, dürfen sie bei der Deklaration von Objekten eingeschränkter Reihungstypen nicht notiert werden, da die Grenzen in der Typdeklaration schon enthalten sind. Die Deklaration von R im folgenden Beispiel ist unzulässig, weil versucht wird, die Indexeinschränkung weiter einzuschränken.

type Ortsvektor is array(1 .. 3) of Float;
R : Ortsvektor(1 .. 3); -- unzulässige Deklaration



 
zurück
 Index   Ada Tour - Dokumentation  
© 2003 Förderverein Ada Deutschland e.V.