5. Sprachelemente / Operatoren
 
zurück
5.8 Qualifizierte Ausdrücke


Weil Bezeichner oder Textzeichen in mehreren Typen gleichzeitig vorkommen können, gibt es Situationen, in denen unklar ist, zu welchem Typ ein Element gehören soll. Zur Auflösung dieser Mehrdeutigkeit kann die Qualifizierung verwendet werden.

Qualifizierte Ausdrücke (qualified_expression <BNF>) sind Ausdrücke, denen explizit ein Typ zugewiesen wurde, oder Ausdrücke, für die ein Untertyp festgelegt werden soll. Der Operand kann entweder ein Ausdruck oder ein Aggregat sein.


Qualifizierter_Ausdruck::=Untertyp'(Ausdruck)|Untertyp'Aggregat

with Text_IO; use Text_IO;
procedure Auto is

   type Automarken is (unbekannt, BMW, Ford, Mercedes, Opel, VW);
   type Fahrzeug is tagged record
      Marke : Automarken := unbekannt;
      Alter : Natural := 0;
   end record;
   type PKW is new Fahrzeug with record
      Personen : Positive := 4;
   end record;
   type LKW is new Fahrzeug with record
      Gewicht : Natural := 0;
   end record;
   Mein_PKW : PKW;
   Mein_LKW : LKW;
   Standard_Fahrzeug : Fahrzeug;
begin
   Standard_Fahrzeug := (Mercedes, Alter => 3);
   Mein_PKW := (Standard_Fahrzeug with Personen => 5);
   -- Wenn bei der Erweiterung von Verbundtypen keine Variable eines
   -- Vorgaengertyps angegeben wurde, sondern ein Aggregat, so muss
   -- dieses mit dem Vorgaengertyp qualifiziert werden.
   Mein_PKW := (Fahrzeug'(BMW, Alter => 1) with Personen => 2);
   Mein_LKW := (Fahrzeug'(Mercedes, Alter => 2) with Gewicht => 3);
end;


Wenn aus dem Kontext, in dem ein Ausdruck (Wert) verwendet wird, der erwartete Typ nicht eindeutig hervorgeht, so kann eine Qualifizierung verwendet werden, um diesen Typ festzulegen.

Beispiel:

type Roemische_Ziffern is ('I', 'V', 'X', 'L', 'C', 'D', 'M');
...
Put ("ASCII: ");
if ('C') < ('V') then                   -- Vergleich auf ASCII-Ebene: 'C' ist kleiner als 'V',
   Put_Line ("C < V");                  -- da es in der ASCII-Tabelle
else                                    -- einen kleineren Wert hat.
   Put_Line ("not C < V");
end if;
Put ("Roemisch: ");
if Roemische_Ziffern'('C') < ('V') then -- Durch die Qualifizierung des ersten Wertes wird der gesamte
   Put_Line ("C < V");                  -- Vergleich auf der Ebene von
else                                    -- Roemischen Ziffern vorgenommen.
   Put_Line ("not C < V");              -- 'C' ist somit jetzt groesser
end if;                                 -- als 'V' gemaess der Definition in "Roemische_Ziffern"
...


Im Gegensatz zur Konvertierung erzeugt der Übersetzer bei der Qualifizierung keinen Code, sondern untersucht nur, ob die verlangte Operation für diesen Typ existiert und fügt diese, wenn vorhanden, ein.

Durch die Qualifizierung wird festgelegt, welche Funktionen zur Verfügung stehen, wie mit der Variablen gerechnet werden kann und welche Vergleiche möglich sind.

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