Inhaltsverzeichnis

4.4.6 Aktive Kommentare

Kommentare innerhalb eines Pascalprogrammes dürfen beliebige Zeichenfolgen enthalten. In Pascal 2.0 haben Kommentare, die direkt nach der öffnenden Kommentarklammer mit einem Dollarzeichen beginnen, eine Steuerfunktion für den Übersetzungsvorgang:

(* $ Dies ist ein normaler Kommentar *)
(*$R+ Dieser Kommentar schaltet die Bereichsüberprüfung ein *)

Ein aktiver Kommentar kann auch mehrere Optionen ein- und ausschalten. Dazu müssen die Schlüsselbuchstaben durch Kommata (ohne Leerstellen) getrennt aufgeführt werden:

(*$R+,C-,P+ range-check ein, post-mortem-chain aus, parameter-check ein *)

Die Wirkung eines aktiven Kommentars gilt für alle nachfolgenden Quelltextzeilen (auch innerhalb von Include-Files), bis ein gegenteiliger aktiver Kommentar gelesen wird.

4.4.6.1 Bereichsüberprüfung

Bei Stringzuweisungen, Parameterübergabe von Strings und allen Parametern der Standardprozeduren wird immer eine Bereichsüberprüfung auf gültige Werte vorgenommen. Auch die Ergebnisse arithmetische Operationen mit reellen und ganzen Zahlen werden immer auf Überschreitung des darstellbaren Zahlenbereiches geprüft.

Der Compiler besitzt einen Schalter, mit dem die Erzeugung von Code für zusätzliche Laufzeittestes gesteuert werden kann. Beim Beginn der Übersetzung ist der Schalter standardmäßig auf aus gestellt. Nach einem aktiven Kommentar der Form

(*$R+   *)

steht der Schalter für Bereichstests (range check) auf ein. Der Compiler erzeugt dann Code, um bei der Laufzeit des Programmes auch folgende Operationen zu prüfen:

Der Schalter für Bereichsüberprüfung kann mit dem folgenden aktiven Kommentar wieder auf aus geschaltet werden:

(*$R- *)

Durch das Einschalten der Bereichsüberprüfungsoption wächst die Codegröße und Programmlaufzeit nur minimal. Zumindest während der Programmentwicklung sollten Sie daher diese Option wählen, um verborgene illegale Zuweisungen festzustellen.

4.4.6.2 Parameterüberprüfung

Pascal 2.0 erlaubt eine Lockerung der Typüberprüfung für Variablenparameter des Typs STRING. Durch die Speicherungsform von Strings ist es nämlich sinnvoll, an eine Prozedur oder Funktion als aktuellen Parameter eine Stringvariable größerer Maximallänge als der zugehörige formale Parameter zu übergeben. Dies widerspricht jedoch den im report vereinbarten Typkompatibilitäts- regeln, nach denen aktuelle Variablenparameter den selben Typ wie der formale Parameter besitzen müssen.

Nach dem aktiven Kommentar

(*$P-    *)

wird die standardmäßig eingeschaltete Typüberprüfung für Stringvariablenparameter so gelockert, daß aktuelle Parameter länger als die formalen Parameterstrings sein dürfen. Um wieder kompatibel zum report zu sein, kann die Parameterüberprüfung anschließend wieder mit

(*$P+    *)

eingeschaltet werden.

Beispiel:

PROGRAM STRINGPARAMETER(INPUT,OUTPUT);
  VAR LONGSTRING: STRING[132];


  PROCEDURE UPCASE(S: STRING);
  (* wandele S in Großbuchstaben *)
    VAR L: INTEGER;
  BEGIN
    FOR L:= 1 TO LENGTH(S) DO
       S[L]:= CHR(ORD(S[L]) AND 127);
  END; (* UPCASE *)

BEGIN
  UPCASE(LONGSTRING);(* Fehlermeldung *)
  (*$P- *)
  UPCASE(LONGSTRING);(* keine Fehlermeldung *)
  (*$P+ *)
  UPCASE(LONGSTRING);(* Fehlermeldung *)
END.

4.4.6.3 Chain-Option

Standardmäßig erzeugt der Compiler Pascal 2.0 für jeden Block Code, um im Falle einer Fehlermeldung zur Programmlaufzeit die dynamische Aufrufkette (dynamic chain) anzuzeigen. In Abschnitt 4.3.3 wurde folgendes Beispiel einer Laufzeitfehlermeldung gegeben.

DIVISION BY ZERO 
 ERROR AT 7437 IN KEHRWERT
CALLED AT 7453 IN P
CALLED AT 7469 IN LAUFZEITFEHLER

Für jeden Block (Hauptprogramm, Prozedur, Funktion) wird ihr Name einmal gespeichert. Möchten Sie diesen Speicherplatz einsparen, oder einem Benutzer Ihrer übersetzten Programme keinen Einblick in die Programmstruktur geben, so können Sie den Schalter zur Speicherung der Namen auf aus stellen:

(*$C-    *)

Dieser aktive Kommentar muß vor dem Programm-, Prozedur- oder Funktionskopf stehen, um für einen Block gültig zu sein. Sie können den Schalter auch selektiv für einzelne Blöcke ein- und ausschalten, dann treten in der dynamic-chain teilweise Fragezeichen »?« als Blocknamen auf:

Beispiel:

(*$C- *)
PROGRAM LAUFZEITFEHLER(INPUT,OUTPUT);

FUNCTION KEHRWERT(X: INTEGER): REAL;
BEGIN
   KEHRWERT:= 1 / X;
END; (* KEHRWERT *)

(*$C+ *)
PROCEDURE P;
BEGIN
  WRITELN(KEHRWERT(0));
END; (* P *)

BEGIN
   P
END.

Die Division durch Null führt zur folgenden Fehlermeldung:

DIVISION BY ZERO 
 ERROR AT 7437 IN ?
CALLED AT 7453 IN P
CALLED AT 7469 IN ?
Die Chain-Option hat keinerlei Auswirkung auf die Ausführungsgeschwindigkeit übersetzter Pascal-Programme.

4.4.6.4 Include-Files

Wie bereits in den vorangegangenen Abschnitten erwähnt, kann der Compiler Teile des Quelltextes bei der Übersetzung von Diskette lesen. Dies ist immer dann notwendig, wenn die Größe des Quelltextes eine Größe von 22 KByte überschreitet. Aber auch um logisch zusammengehörige Teile zusammenzufassen, oder um den Quelltext überschaubar zu halten, bietet sich die Auslagerung von Texten in Include-Files an.

Um Include-Files effizient zur Modularisierung von Programmen einsetzen zu können, ist in Pascal 2.0 die Reihenfolge der Deklarationsteile beliebig. Außerdem kann jeder Deklarationsteil beliebig oft auftreten. Somit können Sie im Vereinbarungsteil des Hauptprogrammes Include-Files aufrufen, die jeweils Konstanten, Typen, Variablen und Prozeduren exportieren..

PROGRAM INCLUDES(INPUT,OUTPUT);

(*$"TURTLE.INC" *)

(*$"STRINGS.INC" *)

BEGIN
END.

Erreicht der Compiler bei der Übersetzung einen aktiven Kommentar, der direkt nach dem Dollarzeichen einen Filenamen in Anführungszeichen enthält, so wird das Ende dieser Zeile ignoriert und ab dieser Stelle der Programmtext von dem File »TURTLE.INC« auf der eingelegten Diskette gelesen. Am Dateiende setzt der Compiler die Übersetzung mit der Folgezeile im Arbeitsspeicher fort.

Include-Files sind normale Quelltexte, die mit den primary- commands SAVE oder END des Editors auf Diskette gespeichert wurden. In einem Programm können beliebig viele Include-Files aufgerufen werden. Außerdem kann auch in einem Include-File ein anderes Include-File aufgerufen werden. Jedoch sind keine Schachtelungen möglich, da der Compiler am Ende eines Files immer zur Übersetzung aus dem Speicher zurückkehrt.

Inhaltsverzeichnis