|
5.9 Allokatoren
Allokatoren sind Funktionen,
die einen Speicherbereich reservieren und einen Zeiger auf diesen Bereich
zurückgeben.
Allokator ::= new Untzertypangabe|new Qualifizierter_Ausdruck
Das Ziel einer Allokatorzuweisung muß ein Zeiger auf ein Objekt vom Typ
der Untertypangabe bzw. des qualifizierten Ausdrucks sein.
Ein Allokator mit qualifiziertem Ausdruck wird als initialisierter Allokator bezeichnet.
Die Speicherstellen werden schon während der Allozierung mit Werten gefüllt.
Beispiel:
-- rekursive Datenstruktur
type Listen_Typ; -- unvollstaendige Typdeklaration
type Listen_Zeiger is access Listen_Typ;
-- erst hier werden die Komponenten bekanntgegeben, eine davon ist der
-- Zeiger auf den Typ selbst.
type Listen_Typ is record
Wert : Integer;
Naechster : Listen_Zeiger;
end record;
Liste : Listen_Zeiger := new Listen_Typ'(Wert => 0, Naechster => NULL);
-- "Liste" ist ein initialisierter Allokator |
Bei Verwendung eines Zeigers auf eine Konstante muß ein initialisierter
Allokator verwendet werden.
Beispiel:
type Float_Zeiger is access Float;
Pi_Zeiger : constant Float_Zeiger := new Float'(Pi); |
Enthält die Typdefinition eine Diskriminante, so muß diese
im Aggregat des qualifizierten Ausdrucks enthalten sein.
Beispiel:
type Geschlecht_Typ is (Maennlich, Weiblich);
type Mensch (Geschlecht: Geschlecht_Typ) is record
Alter : Natural;
Groesse : Natural;
case Geschlecht is
when Maennlich =>
Baertig : Boolean;
when Weiblich =>
Anzahl_Kinder : Natural;
end case;
end record;
type Zeiger_auf_Mensch is access Mensch ;
-- initialisiert
Frau: Zeiger_auf_Mensch := new Mensch'(Geschlecht => Weiblich,
Alter
=> 32,
Groesse
=> 175,
Anzahl_Kinder
=> 2); |
Bei der Verwendung von uneingeschränkten Reihungen werden die Bereichsgrenzen
aus der Größe der einzelnen Felder abgeleitet, deshalb dürfen
diese dann auch keine "others =>"-Zuweisung enthalten.
Beispiel:
type Matrix is array (Integer range <>,Integer
range <>) of Integer;
type PMatrix is access Matrix;
-- initialisiert:
Tabelle_2 : PMatrix := new Matrix'(1 => (1=>1,2=>2,3=>3),
2
=> (1..3 => 0),
3
=> (1|2 => 0, 3 => 9) ); |
Ein Allokator mit Untertypangabe wird als uninitialisierter Allokator
bezeichnet.
Es wird der Speicherplatz reserviert. Nur wenn der Untertyp Voreinstellungen festlegt,
werden den Speicherstellen diese zugewiesen.
Beispiel 1 (nur Reservierung):
-- rekursive Datenstruktur
type Listen_Typ; -- unvollstaendige Typdeklaration
type Listen_Zeiger is access Listen_Typ;
-- erst hier werden die Komponenten bekanntgegeben, eine davon ist der
-- Zeiger auf den Typ selbst.
type Listen_Typ is record
Wert : Integer;
Naechster : Listen_Zeiger;
end record;
Liste_2 : Listen_Zeiger := new Listen_Typ;
-- "Liste_2" ist uninitialisiert |
Beispiel 2 (Reservierung mit Vorbelegung):
type Listen_Typ is record
-- Vorbelegungen der einzelnen Felder
Wert : Integer := -1;
Naechster : Listen_Zeiger := NULL; -- Uninitialisierte
Zeigerobjekte
-- würden automatisch mit "null"
vorbesetzt
end record;
Liste_2 : Listen_Zeiger := new Listen_Typ;
-- "Liste_2" ist uninitialisiert, enthaelt aber vordefinierte Werte
-- Liste_2.Wert ist mit -1 und Liste_2.Naechster ist mit NULL vorbelegt. |
Wenn der Typ eines Allokators ein Zeiger auf einen limitierten Typ ist,
muß ein uninitialisierter Allokator verwendet werden, da für
eingeschränkte Typen keine Zuweisungen erlaubt sind.
Enthält die Typdefinition eine Diskriminante, so muß diese angegeben
werden.
Beispiel:
type Geschlecht_Typ is (Maennlich, Weiblich);
type Mensch (Geschlecht: Geschlecht_Typ) is record
Alter : Natural;
Groesse : Natural;
case Geschlecht is
when Maennlich =>
Baertig :
Boolean;
when Weiblich =>
Anzahl_Kinder :
Natural;
end case;
end record;
type Zeiger_auf_Mensch is access Mensch ;
-- uninitialisiert
Mann: Zeiger_auf_Mensch := new Mensch(Maennlich);
|
Bei der Verwendung von uneingeschränkten Reihungen müssen die
Bereichsgrenzen angegeben werden.
Beispiel:
type Matrix is array (Integer range <>,Integer
range <>) of Integer;
type PMatrix is access Matrix;
-- uninitialisiert:
Tabelle : PMatrix := new Matrix(1..5, 1..5); |
|