5. Sprachelemente / Operatoren
 
zurück
5.7 Typkonvertierungen


Vergleiche und Zuweisungen zwischen Größen, die nicht vom gleichen Typ sind, sind nicht erlaubt. Sofern sie überhaupt sinnvoll sind, benutzt man eine Typkonvertierung..


Typkonvertierungen (type_conversion <BNF>) lassen sich unterteilen nach
  • Konvertierung zwischen Sichten
  • Konvertierung zwischen Werten

Konvertierungen zwischen Sichten geben dem Wert ein neues Aussehen, während der Wert selbst sich nicht ändert.
Es wird nur die Ansicht des Operanden geändert, der Typ selbst bleibt bestehen. Der Operand wird als Name interpretiert.
Bei Konvertierungen zwischen Sichten für einen nicht erweiterbaren Typ muß der Zieltyp auch in den Typ des Operanden zurückkonvertiert werden können, um den Wert lesen und wieder schreiben zu können. Für selbstdefinierte Typhierarchien reicht es daher nicht aus, eine Routine für die Konvertierung von a nach b zu schreiben, sondern es wird noch eine weitere zur Konvertierung von b nach a benötigt.

Konvertierung zwischen Werten verändert den Wert, er wird in einer neuen Form gespeichert.
Es wird, wie bei einem Ausdruck, der Wert des Zieltyps berechnet, mit dem dann weitergearbeitet werden kann.
Bei Konvertierung zwischen Werten reicht es aus, eine Konvertierungsroutine zu schreiben, die den jeweiligen Typ in den Zieltyp umwandelt.


Beispiel:

with Ada.Text_IO;
use Ada.text_IO;
procedure Konvertierung is
   procedure Hole_Float (F : out Float) is
   begin
     F := 1.5;
   end;
   F : Float;
   I : Integer;
begin
   Hole_Float (F);
   Put_Line (Float'Image (F) );
   Hole_Float (Float (I) );
   -- Konvertierung zwischen Sichten:
   -- Die Prozedur "Hole_Float" sieht die Integer-Variable als Float und kann ihr einen Wert zuweisen.
   Put_Line (Float'Image (Float (I) ) );
   -- Konvertierung zwischen Werten:
   -- Der Integer-Wert wird in einen Float-Wert konvertiert.
end;


Eine Typkonvertierung ist eine Konvertierung zwischen Sichten, wenn der Operand der Name eines Objekts und der Zieltyp ein erweiterbarer Typ ist, oder wenn er ein Parameter im Modus out oder in out ist. Typkonvertierungen sind für alle Typen möglich, für die eine entsprechende Konvertierungsfunktion definiert ist.

Typen können nur in gleichartige Typen konvertiert werden, z. B. Zahlentypen in Zahlentypen und Reihungstypen in Reihungstypen. Für Zugriffstypen gilt weiterhin, daß sie für gleiche Typen definiert sein müssen; ein Zeiger auf ein Unterprogramm kann z. B. nicht in einen Zeiger auf einen Integer-Typ konvertiert werden.

Bemerkung:

Wenn Reihungen konvertiert werden sollen, so müssen sie die gleiche Anzahl Dimensionen haben und die Komponententypen müssen gleich sein. Bei unterschiedlichen Grenzen gelten bei uneingeschränktem Zieltyp die Grenzen des Operanden, ansonsten die Grenzen des Zieltyps.

Beispiel 1:

type Spalte is array (Integer range <>) of Integer;
-- uneingeschraenkter Typ:
type Zeile is array (Integer range <>) of Integer;
S : Spalte (1..10);
Z : Zeile (5..14);
...
Z := Zeile ( S );
-- S : Indexwerte von 1 bis 10, Typ: Spalte
-- Zeile ( S ) : Indexwerte von 1 bis 10, Typ: Zeile
-- nach Zuweisung : Indexwerte von 5 bis 14, Typ: Zeile

Beispiel 2:

type Spalte is array (Integer range <>) of Integer;
-- eingeschraenkter Typ:
type Zeile is array (5..14) of Integer;
S : Spalte (1..10);
Z : Zeile;
...
Z := Zeile ( S );
-- S : Indexwerte von 1 bis 10, Typ: Spalte
-- Zeile ( S ) : Indexwerte von 5 bis 14, Typ: Zeile
-- nach Zuweisung : Indexwerte von 5 bis 14, Typ: Zeile



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