7. Programmeinheiten
 
zurück
7.11.2 Paketrumpf


Der Paketrumpf dient der Implementierung der in der Paketspezifikation vereinbarten Programmeinheiten.

Ein Paketrumpf hat folgende Form:

package body <paket_name> is
< Weitere Vereinbarungen, z. B. Rümpfe von untergeordneten Programmeinheiten>
begin
< Anweisungen, die zur Elaborationszeit des Paketes
ausgeführt werden, z. B. Initialisierungen>
end;


Der Paketrumpf ist gegliedert in einen Vereinbarungs- und einen Anweisungsteil.

Der Vereinbarungsteil eines Paketrumpfs muß zu jeder in der Paketspezifikation aufgeführten Spezifikation (Unterprogrammspezifiaktion, Prozeßspezifikation etc.) einen Rumpf enthalten.

Zusätzlich kann der Vereinbarungsteil weitere lokale Vereinbarungen enthalten, die von diesen Rümpfen oder vom Anweisungsteil des Pakets verwendet werden. Auf diese lokalen Vereinbarungen kann von außen nicht zugegriffen werden. Sie sind wie der Anweisungsteil des Pakets Implementierungsdetails, die dem Nutzer eines Pakets verborgen bleiben sollen.

Der Anweisungsteil eines Pakets ist optional. In ihn können Initialisierungsanweisungen aufgenommen werden, um z. B. Datenstrukturen mit Werten vorzubesetzen.

Dieser Anweisungsteil wird abgearbeitet, bevor die erste Anweisung des Hauptprogramms ausgeführt wird.


Beispiel 1:

Im Paketrumpf dieses Beispiels befinden sich die Rümpfe der beiden spezifizierten Unterprogramme "=" und "/". Das Unterprogramm "Gleicher_Nenner" im Paketrumpf ist lokal und kann nur von Komponenten des Paketrumpfs selbst verwendet werden.

package Rationale_Zahlen is
   type Rational is record
      Zaehler : Integer;
      Nenner : Positive;
   end record;
   function "=" (X,Y: Rational) return Boolean;
   function "/" (X,Y: Integer) return Rational; -- zum Erzeugen einer rationalen Zahl
   -- ...
end Rationale_Zahlen;

package body Rationale_Zahlen is
   procedure Gleicher_Nenner (X,Y: Rational) is
   begin
      -- bringt X und Y auf den gleichen Nenner
      null;
   end Gleicher_Nenner;

   function "=" (X,Y: Rational) return Boolean is
      U : Rational := X;
      V : Rational := Y;
   begin
      Gleicher_Nenner (U,V);
      return U.Zaehler = V.Zaehler;
   end "=";

   -- zum Erzeugen einer rationalen Zahl
   function "/" (X,Y: Integer) return Rational is
   begin
      if Y > 0 then
          return (Zaehler => X, Nenner => Y);
      else
          return (Zaehler => -X, Nenner => -Y);
      end if;
   end "/";
   -- ...
end Rationale_Zahlen;

Beispiel 2:

In diesem Beispiel wird ein neues Paket Schluessel_Manager vorgestellt. Es zeigt, wie im Paketrumpf private Typen verwendet werden können.

Im Paketrumpf werden Objekte eines privaten Typs gehandhabt wie alle anderen Objekte. Es können Zuweisungen vorgenommen werden (siehe (a) und (b)).

package Schluessel_Manager is
   type Schluessel is private;
   
   procedure Get_Key(K : out Key);
   function "<" (X, Y : Key) return Boolean;
   --...
private
   type Schluessel is new Natural;
end Schluessel_Manager;

package body Schluessel_Manager is
   Letzter_Schluessel : Schluessel := Natural'First; -- (a)

   procedure Neuer_Schluessel(K : out Schluessel) is
   begin
      Letzter_Schluessel := Letzter_Schluessel + 1; -- (b)
      K := Letzter_Schluessel;
   end Neuer_Schluessel;

   function "<" (X, Y : Schluessel) return Boolean is
   begin
      return Natural(X) < Natural(Y);
   end "<";
end Schluessel_Manager;

Sind nur Typen, Untertypen, Variable und Konstante in einer Paketspezifikation aufgeführt, dann ist ein Paketrumpf nicht erlaubt, es sei denn, in der Paketspezifikation wird das Pragma "Elaborate_Body" verwendet.

Eine Variable, die im Paketrumpf angelegt wird, ist nur hier sichtbar und kann auch nur im Paketrumpf geändert werden. Solange das Paket existiert, existiert diese Variable und kann somit Werte speichern. Sie kann von allen Unterprogrammrümpfen des Pakets als interner Speicher verwendet werden und unterscheidet sich damit von Variablen, die in den Unterprogrammen selbst deklariert sind. Diese behalten ihre Werte von einem Aufruf zum nächsten nicht bei.


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