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