Wir haben vergessen, unsere Speicher-Variable im Paketrumpf zu initialisieren. So enthält sie für jeden Eintrag die Variante für den Schreibtisch und beim Lesen schlägt der Diskriminantenvergleich zwischen Inhalt und Speicher (Inhalt.Schlüssel) fehl. Allerdings kann diese Initialisierung ziemlich mühevoll werden, wenn man sie nicht geschickt macht. Als Erstes fügen wir dem Verbund Akten noch eine Komponente hinzu, die angibt, ob überhaupt etwas vorhanden ist:
type Akten (Schlüssel: Schlüsselmuster := Schreibtisch) is record Leer: Boolean; ... -- Rest wie zuvor end record;
Der Paketrumpf erhält einen ausführbaren Teil (er wird während der Elaboration ausgeführt):
package body Archiv is ... – Deklarationsteil wie bisher begin for Schlüssel in Schlüsselmuster loop case Schlüssel is when Schreibtisch => Speicher (Schlüssel) := (Schlüssel => Schreibtisch, leer => True, Vertraulich => ...); when Tresor => Speicher (Schlüssel) := (Schlüssel => Tresor, leer => True, Geheim => ...); when ... => ... end case; end loop; end Archiv;
Zu unserem Leidwesen müssen wir bei dieser Methode die gesamte Verbunddeklaration in einem gewissen Sinne wiederholen. Wenn wir viele Schlüsselvarianten haben, kann das ziemlich mühevoll werden. Glücklicherweise ist das auch völlig überflüssig, wenn wir bei der Deklaration von Akten gleich die richtigen Vorbelegungswerte mitgeben (soweit erforderlich):
type Akten (Schlüssel: Schlüsselmuster := Schreibtisch) is record Leer: Boolean := True; ... -- Rest ebenfalls mit geeigneten -- Vorbelegungswerten, wo nötig end record;
Die Initialisierung ist nun ganz einfach.
for Schlüssel in Schlüsselmuster loop declare Akt: Akten (Schlüssel); -- Akt: constant Akten (Schlüssel) := ???; begin Speicher (Schlüssel) := Akt; end; end loop;
Man beachte die Variablendeklaration ohne Initialisierung – eine Konstante benötigte einen Initialwert und wir stünden vor dem Problem, wie wir ihn angeben könnten. (Nebenbei: Deklarationen ohne Initialisierung sind durch manche Codingstandards streng verboten, vor allem, wenn der Variablen wie hier nie ein Wert zugewiesen wird! Wie wir gesehen haben, ist jedoch auch so scheinbar Unsinniges manchmal unumgänglich und - wenn man es richtig macht - auch völlig korrekt.)
Ada Magica Inhaltsverzeichnis |
© Copyright 1997 C.K.W. Grein |