Programmiersprache Pascal

Typkonvertierungen

Gegeben ist das folgende Problem:
Der Wert x1 mit dem Datentyp typ1 soll in einen Wert x2 eines Datentyps typ2 überführt werden.
Situation 1

Die Datentypen typ1 und typ2 gehören zu einer Typfamilie.

Als zu einer Typfamilie gehörig angesehen werden sollen die Datentypen, die zum Beispiel zur Darstellung von

verwendet werden.
Zur Typfamilie gehören auch alle eventuellen Teilbereichsdatentypen.
Die Werte zeichnen sich dadurch aus, daß sie rechnerintern eine ähnliche Struktur besitzen und daß ihnen in der Schriftsprache gewöhnlich das gleiche Literal zugeordnet wird.
Die Werte haben rechnerintern jedoch im allgemeinen einen unterschiedlichen Speicherbedarf.
Darüberhinaus unterscheiden sich im allgemeinen die Wertebereiche der Datentypen.

Beispiel (Turbo Pascal):

  VAR s1, s2, s3 : SHORTINT;      {  8 Bit }
      i1, i2, i3 : INTEGER;       { 16 Bit }
  BEGIN
    i1 := 7; i2 := 128; s1 := 8;

    s2 := i1;                     { zulaessig : s2 = 7            }
    s3 := i2;                     { zulaessig : s3 = -128   !!!!! }
    i3 := s1;                     { zulaessig : i3 = 8            }
  END;
Es gilt folgendes: Einige Pascal-Versionen erlauben folgende Art der Typkonvertierung, die auch als Typcast bezeichnet wird:
  zieldatentyp(wert)
Dies trifft zum Beispiel auf Turbo Pascal, Delphi und Gnu Pascal zu.

Beispiel:

  s3 := ShortInt(i2);
Der einzige Unterschied zur impliziten Typkonvertierung besteht darin, daß im Quelltext explizit darauf hingewiesen wird, daß eine Konvertierung stattfindet.

Situation 2

Der Wert x1 wird, ohne Veränderung seiner rechnerinternen Darstellung, als Wert eines anderen Datentyps interpretiert.

Beispiel (Turbo Pascal):

  TYPE farbe = (rot, gruen, blau);
  VAR w1, w2 : WORD;        { 16 Bit }
      i1, i2 : INTEGER;     { 16 Bit }
      f : farbe;
  BEGIN
    i1 := 1; i2 := -1;
    w1 := i1;               { zulaessig : w1 = 1            }
    w2 := i2;               { zulaessig : w2 = 65535  !!!!! }
    f  := i1;               { nicht zulaessig         !!!!! }
    i2 := f;                { nicht zulaessig         !!!!! }
  END;
Es gilt folgendes: Einige Pascal-Versionen erlauben die schon oben beschriebene, folgende Art der Typkonvertierung:
  zieldatentyp(wert)
Beispiel:
  TYPE farbe = (rot, gruen, blau);
  VAR i1, i2 : INTEGER;
      f1, f2 : farbe;
  BEGIN
    i1 := 1; f1 := blau;
    f2 := farbe(i1);        { zulaessig : f2 = gruen  }
    i2 := Integer(f2);      { zulaessig : i2 = 2      }
                            {     oder                }
    i2 := Ord(f2);          { auch in Standard Pascal }
  END;
Situation 3

Die Überführung des Wertes x1 mit dem Datentyp typ1 in einen Wert x2 des Datentyps typ2 erfordert eine Veränderung der rechnerinternen Darstellung.
Die Datentypen typ1 und typ2 sind jedoch in ihrer Bedeutung "verwandt" (z.B. verschiedene numerische Datentypen).

Beispiel:

  VAR r1, r2 : REAL;
      i1, i2 : INTEGER;
  BEGIN
    r1 := 1.0; i1 := 2;
    r2 := i1;                { zulaessig : r2 = 2.0  }
    i2 := r1;                { nicht zulaessig !!!!! }
  END;
Es gilt Für die numerischen Datentypen existieren spezielle Konvertierungsfunktionen.
In Standard Pascal sind dies:
                  x reellwertig
  Trunc(x)        ganzer Anteil von x
  Round(x)        nächste ganze Zahl zu x
Situation 4

Die Überführung des Wertes x1 mit dem Datentyp typ1 in einen Wert x2 des Datentyps typ2 erfordert eine Veränderung der rechnerinternen Darstellung.
Der Datentyp typ1 dient primär der rechnerinternen Verabeitung, der Datentyp typ2 wird zur rechnerexternen Repräsentation der Werte von typ1 verwendet (z.B. numerische Datentypen - Zeichenketten-Datentypen).

Beispiel:

  VAR s : PACKED ARRAY[1..20] OF CHAR;
      r : REAL;
  BEGIN
    s := r;      { nicht zulaessig !!!!! }
    r := s;      { nicht zulaessig !!!!! }
  END;
In diesem Zusammenhang ist zu bemerken: Beispiel (Extended Pascal):
  VAR s : PACKED ARRAY[1..20] OF CHAR;
      r : REAL;
  BEGIN
    r := 3.14;
    Writeln(r);            { Wert von r wird auf Standardausgabe geschrieben }
    WriteStr(s, r);        { Wert von r wird auf Zeichenkette s geschrieben }

    s := '3.14';
    ReadStr(s, r);         { Wert von r wird von der Zeichenkette s gelesen }
    Readln(r);             { Wert von r wird von der Standardeingabe gelesen }
  END;
Situation 5

Die Datentypen typ1 und typ2 sind nicht verwandt.

Die Werte beider Datentypen können nicht ineinander überführt werden.
Bemerkung:
Es existieren keine unmittelbaren Sprachmittel, die dies leisten.
Es ist aber natürlich möglich, spezielle Routinen zu schreiben, die für jeweils zwei Datentypen die Konvertierung der Werte vornehmen.



P. Böhme, 16.07.1996