Implizite Typkonvertierung
Implizite Typkonvertierung Konvertierung von
und
Bei Zuweisungen, Argumenten und in Ausdrücken werden Variablen, Konstanten oder Felder vom Typ int und bigint nun implizit konvertiert, wenn der Zieltyp (int bzw. bigint) nicht dem Quelltyp entspricht.
Beispiel:
Der folgende Code wird unter der Version 5.7.11 übersetzt.
main
()
local
{
tVal1 : int;
tVal2 : bigint;
tResult : int;
}
{
tVal1 # 1000;
tVal2 # -500\b;
tResult # CnvIB(CnvBI(tVal1) + tVal2);
DbgTrace(CnvAI(tResult));
}
Die Typkonvertierung muss explizit durch Angabe der entsprechenden Konvertierungsfunktion (z. B. CnvIB () für tVal2) durchgeführt werden. Mit der Version 5.8.01 ist dies zwar weiterhin möglich, jedoch nicht mehr notwendig. Die Typkonvertierung zwischen int und bigint wird durch das P-Code-System während der Laufzeit implizit durchgeführt:
main
()
local
{
tVal1 : int;
tVal2 : bigint;
tResult : int;
}
{
tVal1 # 1000;
tVal2 # -500;
tResult # tVal1 + tVal2;
DbgTrace(CnvAI(tResult));
}
Wie zu sehen ist, hat sich die Zuweisung des Wertes -500 an die Variable tVal2 vereinfacht, da die Angabe von \b zur Kennzeichnung eines bigint-Wertes nicht mehr notwendig ist. Weiterhin entfallen die Konvertierungsfunktionen CnvBI () und CnvIB (), da auch hier tVal1 implizit nach bigint, sowie das Ergebnis des Ausdrucks (tVal1 + tVal2) implizit nach int konvertiert wird.
Die Konvertierung greift auch bei der Übergabe von Argumenten an Funktionen. Im obigen Beispiel könnte auch CnvAB ()(tResult) verwendet werden, obwohl tResult vom Typ int ist. Dies funktioniert deshalb, weil eine implizite Konvertierung für tResult nach bigint durchgeführt wird, was dem formalen Argument (= Zieltyp) von CnvAB ()() entspricht.
Bei der Zuweisung oder Berechnung eines Wertes, der außerhalb des Wertebereiches des Zieldatentyps liegt, wird der Laufzeitfehler _ErrValueOverflow ausgelöst.
Beispiel:
main
()
local
{
tVal1 : int;
}
{
tVal1 # 10000000000\b; // 10 Milliarden
}
Der zugewiesene Wert liegt außerhalb des Wertebereiches des Datentyps int. Der Code lässt sich zwar fehlerfrei übersetzen. Bei der Ausführung wird jedoch der Laufzeitfehler _ErrValueOverflow ausgelöst.