home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
turbo4
/
readme.
< prev
next >
Wrap
Text File
|
1987-12-08
|
23KB
|
493 lines
TURBO PASCAL 4.0 - ZUSATZINFORMATIONEN
----------------------------------
Diese Datei enthält zusätzliche Informationen und Korrekturen in
letzter Minute.
INHALT
------
1. Hilfe bei Problemen
2. Dateien auf den Originaldisketten
3. Korrekturen und Erweiterungen des Handbuchs
1. HILFE BEI PROBLEMEN
----------------------
Bei Problemen bitten wir Sie, zuerst das Handbuch und diese Datei
sorgfältig durchzulesen. Wenn danach noch Fragen offen sind, können
Sie sich an eine der folgenden Stellen wenden:
1) Ihren Softwarehändler oder einem Userclub
2) Schriftlich an die technische Beratung der
Heimsoeth Software GmbH & Co KG
Fraunhoferstr. 13
8000 München 5
3) In dringenden Fällen: Die Heimsoeth Software Hotline
Montag - Freitag 14.00 - 17.00
Tel: 089/2609467
Sie sollten auf jeden Fall die folgenden Dinge parat haben:
1) Die deutschen Handbücher;
2) Die Versionsnummer von Turbo Pascal. Sie wird vom der Kommando-
zeilen-Version (TPC.EXE) bei jedem Aufruf ausgegeben, in der
integrierten Entwicklungsumgebung bringt der Tastenbefehl
ALT-F10 ein entsprechendes Fenster auf den Bildschirm.
3) Produktnamen, Modellbezeichnung Ihres Computers und eventueller
Zusatz-Hardware (speziell: Grafik-Karten).
4) Die Versionsnummer von DOS, die sich mit den DOS-Befehl VER
ermitteln läßt.
2. DATEIEN AUF DEN ORIGINALDISKETTEN
------------------------------------
Die Beschreibung in Kapitel 1 des Benutzerhandbuchs ist bis auf drei
Punkte korrekt:
- die Diskette II enthält zusätzlich die Datei FRAGEN mit rund 40
allgemeinen Fragen und Antworten zu Turbo Pascal.
- das Programm TINST.EXE befindet sich nicht auf der Diskette I,
sondern auf der Diskette II;
- die Datei CTOPAS.BAT ist nicht im Programmpaket enthalten. Bitte
folgen Sie den Beschreibungen in den Dateien CPASDEMO.PAS und
CPASDEMO.C.
Auf Ihren Originaldisketten finden Sie folgende Dateien:
Diskette 1: Compiler und integrierte Entwicklungsumgebung
TURBO.EXE die integrierte Entwicklungsumgebung
TURBO.TPL die Laufzeitbibliothek von Turbo Pascal. Sie enthält
die Standard-Units System, Dos, Crt, Printer, Turbo3
und Graph3
TURBO.HLP Texte der eingebauten Hilfestellung
TPC.EXE Kommandozeilen-Version von Turbo Pascal
README.COM ein Programm zum Lesen der Datei README
README Tips, Hinweise und Errata
Diskette 2: Dienst- und Demonstrationsprogramme
TINST.EXE Installationsprogramm für Turbo Pascal
UPGRADE.EXE konvertiert Quelltexte der Version 3.0
UPGRADE.DTA zu UPGRADE gehörige Daten
TPMAP.EXE erzeugt Symboltabellen zur symbolischen Fehlersuche
mit einem Debugger wie Periscope oder SYMDEB
TPUMOVER.EXE zur Verwaltung von Unit-Bibliotheken
TPCONFIG.EXE ein Konfigurationsdateien-Konvertierer
BINOBJ.EXE konvertiert Daten in .OBJ-Dateien und ermöglicht das
direkte Einbinden von Grafik-Treibern
BINOBJ.DOC die Dokumentation zu BINOBJ.EXE
MAKE.EXE Verwaltung für große Programmierprojekte
TOUCH.COM verändert Datum und Uhrzeit von Dateien
GREP.COM durchsucht Quelltext-Dateien
CRTDEMO.PAS Demonstration der Möglichkeiten des Units Crt
GR3DEMO.PAS Demonstration der (3.0-)Turtlegrafik in der
Version 4.0
QSORT.PAS Implementation des QuickSort-Algorithmus
LISTER.PAS gibt Programmlistings auf einen Drucker aus und
benutzt dazu das Unit Printer
HILB.PAS berechnet die Hilbert-Matrix mit Real-Variablen
FIB8087.PAS Demonstration eines rekursiven Programms ohne
Überlauf des 8087-Rechenstacks
PROCPTR.PAS demonstriert Zeiger auf Routinen und inline-Code
EMS.PAS zeigt die Verwendung von »Above Memory«
AUXINOUT.PAS ein Textdatei-Gerätetreiber für serielle
Schnittstellen
BCDREAL.PAS demonstriert die Konvertierung von BCD-Programmen
BCD.PAS ein Unit mit Konvertierungsroutinen für BCD-Zahlen
CPASDEMO.PAS demonstriert, wie sich mit Turbo C erzeugte .OBJ-
Dateien in ein Pascal-Programm einbinden lassen
CPASDEMO.C das C-Programm zu CPASDEMO.PAS
CTOPAS.TC Konfigurationsdatei für Turbo C zur Compilierung von
CPASDEMO.C (integrierte Entwicklungsumgebung)
TURBO.CFG Konfigurationsdatei für Turbo C zur Compilierung von
CPASDEMO.C (Kommandozeilen-Version)
SYSTEM.DOC Listing des Interface-Teils des Units System
DOS.DOC Listing des Interface-Teils des Units Dos
CRT.DOC Listing des Interface-Teils des Units Crt
PRINTER.DOC Listing des Interface-Teils des Units Printer
GRAPH3.DOC Listing des Interface-Teils des Units Graph3
TURBO3.DOC Listing des Interface-Teils des Units Turbo3
Diskette 3: Grafik und das Programm "MicroCalc"
GRAPH.DOC Listing des Interface-Teils des Units Graph - enthält
einige wichtige Änderungen und Erweiterungen gegen-
über dem Referenzteil des Handbuchs
GRAPH.TPU das Unit Graph in einer eigenen (compilierten) Datei
ATT.BGI Grafik-Gerätetreiber für den AT&T 6300
CGA.BGI Grafik-Gerätetreiber für CGA- und MCGA-Karten
EGAVGA.BGI Grafik-Gerätetreiber für EGA und VGA
HERC.BGI Grafik-Gerätetreiber für Hercules-Karten
PC3270.BGI Grafik-Gerätetreiber für den PC3720
GOTH.CHR grafischer Vektor-Zeichensatz (Schriftart »Gothic»)
LITT.CHR grafischer Vektor-Zeichensatz mit kleinen Zeichen
SANS.CHR grafischer Vektor-Zeichensatz (Schriftart »SansSerif«)
TRIP.CHR grafischer Vektor-Zeichensatz (Schriftart »Triplex«)
GRDEMO.PAS demonstriert einen Teil der Möglichkeiten von Graph
ARTY4.PAS noch ein Demonstrationsprogramm für Graph
GRLINK.PAS zeigt, wie man Treiber und Vektor-Zeichensätze in
eine .EXE-Datei einbinden kann
DRIVERS.PAS Unit mit Grafik-Treibern für GRLINK.PAS
FONTS.PAS Zeichensätze für GRLINK.PAS
GRLINK.MAK MAKE-Datei zur Compilierung von GRLINK.EXE
MCALC.PAS das Tabellenkalkulationsprogramm MicroCalc
MC*.PAS diverse Units, die zu MicroCalc gehören
MCMVSMEM.ASM direkte Ansteuerung des Bildspeichers für MicroCalc
MCMVSMEM.OBJ die dazugehörige .OBJ-Datei
UNPACK.EXE Programm zum »auspacken« von GREXAMPL.ARC
GREXAMPL.ARC über fünfzig »gepackte« Grafik-Beispiele
FILELIST - eine Liste der Beispielprogramme in GREXAMPL.ARC
und der entsprechenden Prozedur- /Funktionsnamen
ARC PAS - Arc Beispielprogramm
ARCCOORD PAS - GetArcCoords Beispielprogramm
ASPECT PAS - GetAspectRatio Beispielprogramm
BAR PAS - Bar Beispielprogramm
BAR3D PAS - Bar3D Beispielprogramm
CIRCLE PAS - Circle Beispielprogramm
CLOSEGR PAS - CloseGraph Beispielprogramm
CLRDEV PAS - ClearDevice Beispielprogramm
CLRVP PAS - ClearViewPort Beispielprogramm
DETECT PAS - DetectGraph Beispielprogramm
DRPOLY PAS - DrawPoly Beispielprogramm
ELLIPSE PAS - Ellipse Beispielprogramm
FILLPOLY PAS - FillPoly Beispielprogramm
FLOOD PAS - FloodFill Beispielprogramm
GETBKCOL PAS - GetBkColor Beispielprogramm
GETCOL PAS - GetColor Beispielprogramm
GETFILLS PAS - GetFillSettings Beispielprogramm
GETGRMD PAS - GetGraphMode Beispielprogramm
GETLNS PAS - GetLineSettings Beispielprogramm
GETMAXX PAS - GetMaxX Beispielprogramm
GETMAXY PAS - GetMaxY Beispielprogramm
GETPAL PAS - GetPalette Beispielprogramm
GETPIX PAS - GetPixel Beispielprogramm
GETTXTS PAS - GetTxtSettings Beispielprogramm
GETVS PAS - GetViewSettings Beispielprogramm
GETX PAS - GetX Beispielprogramm
GETY PAS - GetY Beispielprogramm
GRERRMSG PAS - GraphErrorMsg Beispielprogramm
GRRES PAS - GraphResult Beispielprogramm
IMSIZE PAS - ImageSize Beispielprogramm
INITGR PAS - InitGraph Beispielprogramm
LINE PAS - Line Beispielprogramm
LINEREL PAS - LineRel Beispielprogramm
LINETO PAS - LineTo Beispielprogramm
MOVEREL PAS - MoveRel Beispielprogramm
MOVETO PAS - MoveTo Beispielprogramms
OUTTXT PAS - OutText Beispielprogramm
OUTTXTXY PAS - OutTextXY Beispielprogramm
PIESLICE PAS - PieSlice Beispielprogramm
PUTIM PAS - PutImage Beispielprogramm
PUTPIX PAS - PutPixel Beispielprogramm
RECT PAS - Rectangle Beispielprogramm
RESCRT PAS - RestoreCrtMode Beispielprogramm
SETACTPG PAS - SetActivePage Beispielprogramm
SETALLP PAS - SetAllPalette Beispielprogramm
SETBKCOL PAS - SetBkColor Beispielprogramm
SETCOL PAS - SetColor Beispielprogramm
SETFLPAT PAS - SetFillPattern Beispielprogramm
SETGRMOD PAS - SetGraphMode Beispielprogramm
SETLNSTY PAS - SetLineStyle Beispielprogramm
SETPAL PAS - SetPalette Beispielprogramm
SETTXTJS PAS - SetTextJustify Beispielprogramm
SETTXTST PAS - SetTextStyle Beispielprogramm
SETVISPG PAS - SetVisualPage Beispielprogramm
SETVP PAS - SetViewPort Beispielprogramm
TXTHT PAS - TextHeight Beispielprogramm
3. KORREKTUREN UND ERWEITERUNGEN DES HANDBUCHS
----------------------------------------------
ACHTUNG: Das Unit GRAPH ist nach Drucklegung des Referenzhandbuchs
um einige Funktionen erweitert und in anderen Teilen ver-
ändert worden. Die entsprechenden Informationen finden Sie
in der Datei GRAPH.DOC auf der Diskette III.
Kapitel 4 (Bd I, S 57), "Die fünf Integer-Typen": Erweiterung
-------------------------------------------------------------
Turbo Pascal definiert zwei Konstanten - MaxInt mit einem Wert von
32767 und MaxLongInt mit einem Wert von 2147483647.
Kapitel 15 (Bd II, S 43), "Umwandlung von Variablentypen": Erweiterung
----------------------------------------------------------------------
Die Standardfunktionen Lo und Hi liefern das niederwertige bzw.
höherwertige Byte einer Word-Variablen zurück. Um das niederwertige
oder höherwertige Wort einer LongInt-Variablen zu ermitteln, kann
man eine explizite Typ-Umwandlung verwenden:
type
WordRec = record { für die Typ-Umwandlung }
Low, High : Word;
end;
var
L : LongInt;
begin
L := $10000; { dezimal: 65536 }
Writeln(WordRec(L).Low); { 0 }
Writeln(WordRec(L).High); { 1 }
end.
In ähnlicher Weise lassen sich Aufrufe der Funktionen Seg und Ofs
durch direkte Typ-Umwandlungen ersetzen (womit einige Bytes Pro-
grammcode und einige Mikrosekunden Laufzeit eingespart werden):
type
PtrRec = record { für die Typ-Umwandlung }
Ofs, Seg : Word;
end;
var
P : Pointer;
begin
P := Ptr($1234, $4567);
Writeln(PtrRec(P).Ofs); { $4567 }
Writeln(PtrRec(P).Seg); { $1234 }
end.
Kapitel 20 (Bd II, S 97) "Units, die andere Units voraussetzen": Erweiterung
-----------------------------------------------------------------------------
Ein Programm *kann* sämtliche direkt und indirekt vorausgesetzten
Units mit uses aufführen - tatsächlich nötig ist aber nur die Angabe
der Units, auf die es direkt zugreift. Im gezeigten Beispiel greift
"Hauptprogramm" nur auf "Unit2" direkt zu, die uses-Anweisung in
"Hauptprogramm" kann deshalb entweder als
uses Unit1, Unit2;
oder als
uses Unit2;
geschrieben werden. Im zweiten Fall stellt der Compiler selbständig
fest, daß Unit2 das Unit Unit1 voraussetzt und nimmt es in das
Programm auf.
Kapitel 23 (Bd II, S 113), "Das Unit System": Erweiterung
---------------------------------------------------------
Das Unit SYSTEM deklariert eine Variable namens FileMode, deren
Wert den Zugriffscode bei der Öffnung typisierter und untypisierter
Dateien mit Reset festlegt. FileMode wird beim Start des Programms
auf den Wert 2 initialisiert ("Lesen und Schreiben erlaubt"). Durch
eine direkte Zuweisung an diese Variable läßt sich der DOS-Zugriffs-
code bei folgenden Aufrufen von Reset für typisierte und untypi-
sierte Dateien festlegen. Die folgenden Werte für FileMode sind in
allen DOS-Versionen ab 2.0 definiert:
0 nur Lesen
1 nur Schreiben
2 Lesen und Schreiben
Die DOS-Versionen ab 3.0 erlauben zusätzliche Werte für FileMode,
über die primär die Dateiverwaltung in Netzwerken abgewickelt wird.
Das DOS-Handbuch enthält weitere Einzelheiten.
Hinweis: Auf die Erzeugung von Dateien mit Rewrite sowie die Bear-
beitung von Textdateien hat der Wert von FileMode keinen Einfluß
(Rewrite setzt bei typisierten und untypisierten Dateien immer
"Lesen und Schreiben erlaubt").
Kapitel 23 (Bd II, S 114), "Das Unit System": Erweiterung
---------------------------------------------------------
Neben den angegebenen vier Interrupt-Vektoren wird zusätzlich der
Vektor für "kritische Fehler" (in einer Variablen namens SaveInt24)
gespeichert und eine eigene Behandlungsroutine gesetzt. Aus diesem
Grund lassen sich auch Fehler wie "Laufwerk nicht bereit" über
IOResult abfangen (vgl. Anhang F im Benutzerhandbuch).
Kapitel 23 (Bd II, S 116), "Das Unit Dos": Korrektur
----------------------------------------------------
Die vier Zeigerfelder im Record eine Textdatei-Variablen, die auf
die Routinen für "Open", "InOut", "Flush" und "Close" zeigen, heißen
nicht "Proc", sondern "Func". Die korrekte Definition von TextRec
ist:
TextRec = record
....
OpenFunc: Pointer; { nicht: "OpenProc" }
InOutFunc: Pointer; { nicht: "InOutProc" }
FlushFunc: Pointer; ...
CloseFunc: Pointer; ...
....
end;
Das in Kapitel 25 beschriebene Unit AuxInOut ist von diesen Namens-
änderungen nicht betroffen, weil es einen eigenen Datentyp definiert.
Kapitel 23 (Bd II, S 123), "Das Unit Crt": Korrektur
----------------------------------------------------
Eine Konstante namens Last ist nicht definiert, stattdessen
deklariert das Unit CRT die Variable LastMode, die bei einem Aufruf
von TextMode denselben Zweck erfüllt. Zusätzlich definiert CRT eine
Konstante mit dem Namen Font8x8, mit der 43 bzw. 50 Zeilen Text auf
EGA- bzw. VGA-Karten gesetzt werden können (siehe Anmerkung zu
"TextMode" in einem der folgenden Abschnitte).
Kapitel 24 (Bd II, S 159), "Units und der 8087": Einschränkung
--------------------------------------------------------------
Der Linker prüft nicht, ob ein Unit über den Befehl {$L} eine
.OBJ-Datei mit 8087-Code aufnimmt - Maschinenprogramme müssen
gegebenenfalls selbst prüfen, ob ein Coprozessor installiert ist.
Kapitel 25 (Bd II, S 185) "Aufrufe als NEAR und FAR": Korrektur
---------------------------------------------------------------
Eine Prozedur oder Funktion wird als "eingeschachtelt" bezeichnet,
wenn sie innerhalb einer anderen Prozedur oder Funktion deklariert
ist (also lokal dazu). In diesem Fall ist sichergestellt, daß sich
die aufrufende und die aufgerufene Routine immer im selben Code-
Segment befinden - deshalb nimmt der Compiler eine weitere
Optimierung vor und codiert diese Aufrufe auch dann als NEAR, wenn
der Modus {$F+} gesetzt ist.
Beim Aufruf einer lokal deklarierten Prozedur oder Funktion erzeugt
der Compiler direkt vor dem CALL den Befehl PUSH BP, übergibt also
das BP-Register der aufrufenden Routine als zusätzlichen Parameter.
Nachdem die aufgerufene Routine ihren eigenen Stack (mit PUSH BP /
MOV BP,SP) eingerichtet hat, kann auf das BP-Register der *aufru-
fenden* Routine über [BP+4] und damit auf die lokalen Variablen
dieser übergeordneten Routine zugegriffen werden. (Wenn die auf-
rufende Routine ihrerseits eingeschachtelt ist, wird die Verbindung
zur nächsthöheren Ebene wiederum über [BP+4] hergestellt usw).
Ein Beispiel:
procedure A;
var IntA: Integer;
procedure B;
var IntB: Integer;
procedure C;
var IntC: Integer;
begin
inline($8B/$46/<IntC/ { MOV AX,IntC[BP] ; AX = IntC }
$8B/$5E/$04/ { MOV BX,[BP+4] ; BX = B's Stack }
$36/$8B/$47/<IntB/ { MOV AX,SS:IntB[BX] ; AX = IntB }
$8B/$5E/$04/ { MOV BX,[BP+4] ; BX = B's Stack }
$36/$8B/$5F/$04/ { MOV BX,SS:[BX+4] ; BX = A's Stack }
$36/$8B/$47/<IntA);{ MOV AX,SS:IntA[BX] ; AX = IntA }
end {C};
begin {B}
end {B};
begin {A}
end {A};
Hinweis: Verschachtelte Prozeduren und Funktionen können nicht als
external deklariert werden.
Kapitel 25 (Bd II, S 196), "Maschinencode mit inline": Korrektur
----------------------------------------------------------------
Die Reihenfolge der Kommentare stimmt nicht mit den Maschinen-
befehlen überein. Das korrekte Beispiel ist:
function LongMul(X,Y : Integer) : LongInt;
inline(
$5A/ { POP DX ; Pop X }
$58/ { POP AX ; Pop Y }
$F7/$EA); { IMUL DX ; DX:AX = X*Y }
Kapitel 26 (Bd II, S 260), "GetFTime": Korrektur
------------------------------------------------
Der Parameter Time ist inkorrekt als DateTime (d.h. als Record)
deklariert. Tatsächlich erwartet GetFTime hier einen LongInt, in dem
das ermittelte Datum und die Uhrzeit im gepackten Format von DOS
gespeichert werden:
procedure GetFTime(var F; var Time: LongInt);
Kapitel 26 (Bd II, S 326), "RestoreCrtMode": Erweiterung
--------------------------------------------------------
Anstelle von RestoreCrtMode kann auch ein Aufruf von TextMode mit
der Variablen LastMode verwendet werden (siehe nächster Abschnitt):
program RestoreDemo;
uses Crt;
var
OrigMode: Integer;
begin
OrigMode := LastMode;
.....
TextMode(OrigMode); { schaltet in den Textmodus zurück }
Kapitel 26 (Bd II, S 364), "TextMode-Prozedur": Erweiterung und Korrektur
-------------------------------------------------------------------------
Der Parameter Mode hat nicht den Typ Integer, sondern Word. Die
korrekte Deklaration lautet also:
procedure TextMode(Mode: Word);
Ein Aufruf von TextMode mit der (in CRT deklarierten) Variablen
LastMode setzt den Videomodus, der *vor* dem letzten Aufruf von
TextMode bzw. beim Start des Programms aktiv war.
Das Unit CRT definiert zusätzlich die Konstante Font8x8, über die
auf EGA- und VGA-Karten 43 bzw. 50 Textzeilen gesetzt werden
können. Der Aufruf
TextMode(CO80+Font8x8)
setzt auf EGA-Karten "80*43 Zeichen farbig", auf VGA-Karten "80*50
Zeichen farbig". Da auch dieser Modus in LastMode gespeichert wird,
schaltet der folgende Aufruf von TextMode wieder von 43 bzw. 50
Zeilen auf 25 Zeilen um, ohne den Videomodus (d.h. CO80 oder BW80)
zu verändern:
TextMode(Lo(LastMode));
Analog dazu kann von 25 auf 43 bzw. 50 Zeilen umgeschaltet werden:
TextMode(Lo(LastMode) + Font8x8);
Wenn bereits beim Start eines Turbo Pascal-Programms ein Textmodus
mit 43 oder 50 Zeilen gesetzt ist, wird der entsprechende Wert in
LastMode festgehalten und WindMax (die untere rechte Fenstergrenze)
auf den entsprechenden Wert initialisiert.
Kapitel 26 (Bd II, S 396), "Val-Prozedur": Erweiterung
------------------------------------------------------
Das Verhalten von Val bei Überläufen hängt vom Stand des Compiler-
Schalters {$V} (Bereichs-Prüfung) und dem Typ des übergebenen
Parameters V ab. Im Modus {$V+} erzeugt Val einen Laufzeitfehler,
wenn das Ergebnis der Interpretation nicht im zulässigen
Wertebereich von V liegt, also beispielsweise:
Val('999999', Int_Var, code); { würde Int_Var den
Wert 99999 zuordnen }
Im Modus {$V-} hängt das Ergebnis bei Überläufen vom Typ der als V
übergebenen Variablen ab: Für Real-Typen und LongInt ist das Ergeb-
nis undefiniert, code hat einen Wert ungleich 0. Für alle anderen
numerischen Typen wird V der "Überlauf-Rest" zugewiesen, code hat
den Wert 0 (!). Aus diesem Grund sollte für die Konvertierung von
Integerwerten immer ein LongInt benutzt und die Bereichsprüfung
zuvor abgeschaltet werden:
{$R-}
Val('99999', LongIntVar, code)
if (code <> 0) or
(LongIntVar < 0) or (LongIntVar > 65535) then
... { Fehler! }
else
WordVar := LongIntVar;
In diesem Beispiel wird nach der Konvertierung explizit geprüft, ob
das Ergebnis im zulässigen Wertebereich (hier: für Word) liegt.
Eine zweite Erweiterung: Val ignoriert führende Leerzeichen. Die
folgenden Beispiele haben also beide dasselbe Ergebnis:
Val(' 123', Int_Var, code); { ergibt 123 }
Val('123', Int_Var, code); { dito }
Kapitel 26 (Bd II, S 371), "Window-Prozedur": Erweiterung
---------------------------------------------------------
Ein Aufruf von Window erzeugt nicht nur ein Textfenster, sondern
setzt auch den Cursor auf die Position (1,1) innerhalb dieses
Fensters (d.h. in die linke obere Ecke).