next up previous
Nächste Seite: Charakteristik verschiedener Typen Aufwärts: Systemspezifische Besonderheiten Vorherige Seite: Restriktionen des Einpass-Compilers

Typentransfer und Typenkonversion

Die systemnahe Programmierung macht es zeitweilen nötig, einer Variablen innerhalb eines Ausdrucks einen neuen Typ zu geben. Dabei wird die Bitkombination der Speicherzelle, die für eine Variable des Ursprungtyps reserviert ist, unverändert in einen neuen Zieltyp übernommen. Dabei müssen jedoch die Grössen des Ursprungtyps sowie des Zieltyps gleich gross sein.

Programme, die diesen Mechanismus verwenden, sind allerdings schlecht portierbar, da der Speicherbedarf der einzelnen Typen nicht auf allen Rechnern gleich ist. Wird ein solcher Typentransfer benötigt, muss dafür in die Prozedur CAST aus dem Modul SYSTEM importiert werden. Dadurch ist die Systemabhängigkeit bereits in der Importliste angezeigt.

Der vielleicht bekannte Mechanismus, dass ein Ausdruck geklammert und von einem Typnamen angeführt wird, ist ebenfalls noch enthalten. Allerdings wird dann kein Typentransfer, sondern eine sichere Typenkonversion ausgeführt. Dies macht eigentlich die Prozeduren ORD, CHR, FLOAT und VAL unnötig, sie bleiben jedoch aus Gründen der Kompatibilität in der Sprache enthalten, sollten aber nicht mehr verwendet werden. Die Typenkonversion funktioniert nur mit den unstruktierten Typen, also auch mit Unterbereichen und Aufzählungstypen.

LONGINT("B") entspricht ORD("B")
CHAR(66) entspricht CHR(66)
REAL(100) entspricht FLOAT(100)
  ...  
BITSET(3) Geht nicht, da nicht unstrukturiert

Die Verwendung von Typkonversionen bietet den Vorteil, dass der Compiler angewiesen werden kann, einen ganz bestimmten Typ zu erzeugen. Die Funktion ORD() konvertiert immer zu einem LONGINT. Soll aber das Resultat einer Konversion beispielsweise einer Variablen vom Typ INTEGER zugewiesen werden, muss anschliessend wieder zu INTEGER konvertiert und dazu zusätzlicher Code erzeugt werden. Dies kann mit Typkonversionen vermieden werden.

Viele Betriebssystemroutinen geben einen zu wenig spezifischen Zeigertyp oder gar ADDRESS zurück. Für die Weiterverarbeitung muss der Typ des Resultats konvertiert werden. Dies geschieht mit einer CAST-Anweisung, die den Resultatstyp in den für die weitere Bearbeitung nötigen Typ umwandelt. In gewissen Fällen wird durch dieses Vorgehen eine Hilfsvariable benötigt, die unter Umständen danach nie mehr verwendet wird.


\begin{example}
Beispiel:
\begin{verbatim}VAR
p:ProcessPtr;
BEGIN
p:=CAST(Pr...
...Task(NIL))^.stackSize>4000,
ADR(''Zuwenig Stack''));\end{verbatim}\end{example}

Damit dies möglich ist, musste die Syntax erweitert werden:
\begin{ebnf}{Designator}
\item[Factor]
{\tt NOT Factor \verb*'\vert' number \ve...
...dq\
\verb*'\vert' \dq\verb*'^'\dq\ \verb*'\vert' ActualParameter\}.}
\end{ebnf}


next up previous
Nächste Seite: Charakteristik verschiedener Typen Aufwärts: Systemspezifische Besonderheiten Vorherige Seite: Restriktionen des Einpass-Compilers
Claudio Nieder 2000-11-12