The following hints were published in issue 4 of the magazine „CHIP SPECIAL".
|
WITH
-Anweisungen) und kommen trotz stundenlanger Fehlersuche nicht dahinter, wo die "Wanzen" versteckt sind.
Zu guter Letzt ist der Fehler endlich lokalisiert, nämlich im Compiler!
Genau das ist uns nämlich passiert.
Die Fehler betreffen die CP/M- und die MS-DOS-Version von Turbo-Pascal fast in gleicher Weise.
1) WITH
-Anweisung:
WITH
-Anweisung überlagert werden, was man als selbstverständlich erwarten sollte.
Beispiel:
const xmax=100; var T:record xmax,ymax : integer; end; begin T.xmax:=55; with T do begin writeln(xmax); ymax:=xmax; end; writeln(t.ymax); end.Anstatt beide Male 55 auszugeben, ergibt sich bei CP/M die Ausgabe zwei mal 100 und bei MS-DOS 100 und 55.
DISKZAP
(CP/M-Version aus Heft 2) sich dieser Fehler unbemerkt eingeschlichen hat.
3) Funktionsnamen-Uberlagerung (beide Versionen)
Es ist möglich, daß eine Funktion und eine in derselben definierte Konstante den selben Namen haben.
Das sollte natürlich eine entsprechende Fehlermeldung verursachen, weil man dann sicherlich kein Ergebnis mehr nach außen geben kann.
Dem ist aber nicht so.
C-
, die die CTRL-C
Abfrage abschaltet.
Diese Anweisung wirkt für das gesamte Programm und kann nicht wieder abgeschaltet werden.
Oder doch?
Manchmal möchte man ein Programm an einer kritischen Stelle abbrechen und gleichzeitig woanders ein CTRL-C
als Eingabe zulassen.
Für diese Zwecke haben die Turbo-Programmierer vorgesorgt, ohne das im Handbuch zu erwähnen!
Des Rätsels Lösung heißt CBREAK
und ist eine vordefinierte Variable vom Typ BOOLEAN
.
Diese ist zumindest in den CP/M und MS-DOS Versionen 3.0 vorhanden.
CBREAK:=TRUE
, falls die CTRL-C
Unterbrechung erlaubt ist (C+
) und FALSE wenn nicht (C-
).
Diese Variable kann man während des gesamten Programms umbesetzen, was dieselbe Wirkung wie eine entsprechende Compiler-Anweisung hat.
PROCEDURE Test(VAR ch : CHAR); BEGIN CBREAK:= FALSE; READ (KBD,ch); CBREAK:= TRUE; END;
Scanned by
Werner Cirsovius
December 2004
© CHIP Verlag