5. Sprachelemente / Operatoren
 
zurück

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);



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