home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turbo Toolbox
/
Turbo_Toolbox.iso
/
tc20
/
helpme.doc
< prev
next >
Wrap
Text File
|
1988-10-13
|
22KB
|
514 lines
TURBO C 2.0: ANTWORTEN AUF ALLGEMEINE FRAGEN
I n s t a l l a t i o n u n d S t a r t
----------------------------------------------------------------------
F. Wie wird Turbo C auf meinem System installiert?
A. Legen Sie die Diskette 1 ("INSTALL/HELP") in das Laufwerk A:
Ihres Computers, setzen Sie dieses Laufwerk mit dem Befehl
A: <RETURN>
auf der DOS-Kommandoebene als Standard und geben Sie dann den
Befehl
INSTALL <RETURN>
INSTALL fragt nun als erstes zurück, von welchem Disketten-
laufwerk die Dateien gelesen werden sollen. Tippen Sie
A: <RETURN>
Als nächstes erscheint nun das Menüsystem von INSTALL, wobei
der untere Bildschirmrand grundsätzlich Erläuterungen zum
jeweils gewählten Punkt enthält. Folgen Sie diesen Anweisungen.
F. Wie wird Turbo C nach der Installation gestartet?
A. Setzen Sie das Directory als Standard, das Sie auch bei
der Installation mit INSTALL angegeben haben und geben
Sie dann (auf der DOS-Kommandoebene) den Befehl
TC <RETURN>
Das Kapitel 2 des Benutzerhandbuchs zeigt schrittweise,
wie es von diesem Punkt an weitergeht.
F. Wo liegen die Unterschiede zwischen TC.EXE und TCC.EXE?
A. Das Turbo C-Programmierpaket enthält zwei voneinander unabhängige
Compiler: die integrierte Entwicklungsumgebung (TC.EXE) und die
Kommandozeilen-Version TCC.EXE.
Bei ersterer handelt es sich um einen "Programmverbund" aus
Compiler, Editor, Debugger, kontextbezogener Hilfestellung usw., wobei
die einzelnen Funktionen über ein Menüsystem miteinander verbunden sind;
bei zweiterem um einen reinen Compiler, der durch die Eingabe
einer Kommandozeile (von der DOS-Kommandoebene aus) gestartet wird
und während der Bearbeitung eines C-Quelltextes keine weitere
Interaktion mit dem Benutzer ausführt.
F. Was ist eine "Konfigurationsdatei"?
A. Über eine Konfigurationsdatei wird Turbo C mitgeteilt, welche
Einstellungen (Compiler-Schalter, Optionen usw.) als Standard ver-
wendet werden sollen und in welchen Directories sich Include-
Dateien bzw. Bibliotheken befinden.
TC.EXE - die integrierte Entwicklungsumgebung - sucht beim
Start nach einer Datei namens TCCONFIG.TC; TCC.EXE - die
Kommandozeilen-Version des Compilers - nach einer Datei namens
TURBOC.CFG.
F. Wie werden Konfigurationsdateien erzeugt?
A. Von der integrierten Entwicklungsumgebung aus: durch die
Auswahl von Options/Save options. Turbo C speichert hier
sämtliche Daten, die von den durch Borland gesetzten
Vorgaben abweichen, in einer Datei, die standardmäßig
den Namen TCCONFIG.TC trägt.
Für die Kommandozeilen-Version: entweder durch
Konvertierung der Datei TCCONFIG.TC mit dem Programm
TCCONFIG.EXE (siehe Referenzhandbuch, Seite 45) oder
durch die direkte Eingabe mit einem ASCII-Editor (siehe
Referenzhandbuch, Anhang C).
I n t e g r i e r t e E n t w i c k l u n g s u m g e b u n g
----------------------------------------------------------------------
F. Anscheinend findet Turbo C meine mit #include <...> angegebenen
Dateien nicht. Wieso?
A. Der Compiler sucht Include-Dateien in den Directories, die über
Options/Directories/Include directories angegeben sind. Das Pro-
gramm INSTALL trägt hier das Directory ein, in das auch die
*.H-Dateien von den Originaldisketten kopiert wurden.
Wenn Sie eigene Include-Dateien erstellen und diese Dateien
in einem anderen Verzeichnis speichern, müssen Sie den Eintrag
in O/D/Include directories entsprechend erweitern.
F. Ich erhalte die Meldung 'Linker error: Unable to open
input file 'C0x.OBJ'' ab. Wieso?
A. Der Linker sucht den Startcode und die Laufzeitbibliotheken in den
Directories, die über Options/Directories/Library directories an-
gegeben sind. Das Programm INSTALL trägt hier das Directory ein,
in das auch die *.LIB und *.OBJ-Dateien von den Originaldisketten
kopiert wurden.
F. Wie kriege ich den Compiler dazu, meine eigenen Bibliotheken anstelle
der Standardbibliotheken einzubinden? Wie sieht es mit mehreren
Quelltexten für ein Programm aus?
A. Siehe Benutzerhandbuch, Kapitel 3.
F. Der Linker beharrt darauf, Funktionen wie initgraph() nicht zu
kennen. Wieso?
A. Setzen Sie den Schalter Options/Linker/Graphics Library auf ON oder
definieren Sie eine .PRJ-Datei, die graphics.lib explizit aufführt.
F. Bei der Compilierung eines ganz gewöhnlichen Programms reagiert der
Compiler auf die Zeile #include <stdio.h> mit der Meldung
"'Unable to open include file 'stdarg.h'".
A. Aller Wahrscheinlichkeit nach wurde die Maximalzahl von Dateien
überschritten, die DOS gleichzeitig offen halten kann. Fügen
Sie Ihrer Datei CONFIG.SYS die Zeile
FILES=20
hinzu - danach reserviert DOS genügend Platz, um bis zu 20
Dateien gleichzeitig bearbeiten zu können.
ACHTUNG: Die Datei CONFIG.SYS wird nur beim Start des Systems
ausgewertet - Sie müssen den Computer also neu starten, damit
Ihre Änderungen wirksam werden.
F. Die Farben der Menüs von Turbo C passen *absolut* nicht zu meinem
Schreibtisch. Was tun?
A. Benutzen Sie TCINST.EXE zur Verwirklichung Ihrer eigenen Vorstellungen.
F. Wie läßt sich ein Quelltext am einfachsten auf den Drucker bringen?
A. Aktivieren Sie den Editor von Turbo C, laden Sie den Quelltext und
geben sie den Tastenbefehl Ctrl-K-P. Dieser Befehl sendet entweder
den momentan (mit Ctrl-K-B und Ctrl-K-K markierten) Block zum Drucker
- oder, falls überhaupt kein Block markiert ist, die gesamte Datei.
F. Beim Aufruf von MAKE, Run oder bei der Aktivierung des Debuggers
übersetzt der Compiler manchmal verschiedene Teile meines Programms
von neuem - obwohl die einzelnen Module wirklich bereits auf dem
letzten Stand der Dinge sind.
A. MAKE orientiert sich ausschließlich an Datum und Uhrzeit
der einzelnen Dateien. Wenn Sie beispielsweise mit setfattr() expe-
rimentiert und einem Ihrer Quelltexte ein "Zukunftsdatum" verpaßt
haben, dann wird die entsprechende .OBJ-Datei für MAKE bis zum
tatsächlichen Erreichen dieses Zeitpunkts immer "älter" sein.
Diese und ähnliche Probleme lassen sich mit TOUCH lösen - einem
Programm, das sämtlichen angegebenen Dateien die momentane System-
zeit gibt.
K o m m a n d o z e i l e n - V e r s i o n
----------------------------------------------------------------------
F. Anscheinend findet Turbo C meine mit #include <...> angegebenen
Dateien nicht. Wieso?
A. Der Compiler sucht Include-Dateien in den Directories, die über
den Parameter -I angegeben sind. Das Programm INSTALL erzeugt eine
Konfigurationsdatei (TURBOC.CFG), die von TCC.EXE automatisch gelesen
wird und in der das Directory eingetragen ist, in das auch die
*.H-Dateien von den Originaldisketten kopiert wurden.
F. Ich erhalte die Meldung "Linker error: Unable to open
input file 'C0x.OBJ'". Wieso?
A. Der Linker sucht den Startcode und die Laufzeitbibliotheken in den
Directories, die über den Parameter -L der Konfigurationsdatei
TURBOC.CFG angegeben sind. Das Programm INSTALL trägt hier das
Directory ein, in das auch die *.LIB und *.OBJ-Dateien von den
Originaldisketten kopiert wurden.
Hinweis: Bei einem direkten Aufruf von TLINK müssen Sie den Such-
weg für Bibliotheken und Startcode explizit angeben - TLINK liest
die Konfigurationsdatei TURBOC.CFG *nicht*.
F. Der Linker beharrt darauf, Funktionen wie initgraph() nicht zu
kennen. Wieso?
A. TCC sucht die Grafik-Bibliothek (graphics.lib) nur nach expliziter
Anweisung ab. Zur Compilierung von BGIDEMO ist beispielsweise die
folgende Kommandozeile notwendig:
TCC BGIDEMO.C GRAPHICS.LIB <RETURN>
Hinweis: Hier wurde vorausgesetzt, daß eine Konfigurationsdatei
TURBOC.CFG mit den Suchwegen für Bibliotheksdateien existiert.
E i n - u n d A u s g a b e
----------------------------------------------------------------------
F. Die Befehle cprintf("Hello\n"); cprintf("world\n"); ergeben
Hello
world
Woran liegt das?
A. cprintf() arbeitet in der Version 2.0 von Turbo C so, wie
es eigentlich von Anfang an vorgesehen war - '\n' wird nicht
(wie bei printf) in eine CR/LF-Kombination "übersetzt", sondern
tatsächlich als einzelnes LF-Zeichen ausgegeben.
Wenn Sie den Cursor nicht nur eine Zeile tiefer, sondern auch
noch wieder in die Spalte 1 dieser Zeile setzen wollen, müssen Sie
das CR-Zeichen beim Aufruf von cprintf() direkt angeben: Die Befehls-
folge cprintf("Hello\n\r"); cprintf("world\n\r"); erzeugt das gewünschte
Ergebnis (wobei es keine Rolle spielt, ob '\r' vor '\n' oder danach
angegeben wird).
F. Wie kann ich mit einem Programm Ausgaben auf dem Drucker erzeugen?
A. Ab der Version 1.5 von Turbo C ist eine FILE-Variable namens stdprn
in der Datei stdio.h definiert, die beim Start des Programms auto-
matisch geöffnet wird. Ein Beispiel dazu:
#include <stdio.h>
main()
{ fprintf(stdprn, "Hello, world\n");
}
Die meisten Drucker arbeiten übrigens mit einer zeilenweisen Pufferung -
tatsächlich gedruckt wird also erst nach dem abschließenden '\n'.
F. Bei der Bearbeitung einer Binärdatei scheint sich Merkwürdiges zu tun,
wenn die Werte 0x0D und 0x0A gelesen oder geschrieben werden. Was tun?
A. Wahrscheinlich haben Sie die Datei ohne den Zusatz "b" geöffnet -
die Routinen zur Dateibearbeitung gehen dann von einer Textdatei aus
und übersetzen die Bytefolge 0x0D 0x0A als "CR/LF" in ein einzelnes LF beim
Lesen bzw. erweitern den Wert 0x0A als "LF" auf eine CR/LF-Folge beim
Schreiben.
Öffnen Sie die Datei explizit im Binärmodus, wie es das folgende
Beispiel zeigt:
#include <stdio.h>
main()
{ FILE *binary_fp;
char buffer[100];
binary_fp = fopen("MYFILE.BIN", "rb");
fread(buffer, sizeof(char), 100, binary_fp);
:
}
F. Wieso weigern sich printf() und puts(), farbige Zeichen zu erzeugen?
A. Weil diese beiden Funktionen mit Standardattributen arbeiten. Für
bunte Ausgaben und andere Spezialitäten des IBM PC sind die Routinen
cprintf() und cputs() vorgesehen:
#include <conio.h>
main()
{
textcolor(BLUE);
cprintf("Ich bin blau."); /* Hick! */
}
F. Wie wird ein long-Wert mit printf ausgegeben?
A. Mit "%ld":
long int l = 70000L;
printf("%ld", l);
F. Wie wird ein Wert im Format long double (= Extended) ausgegeben?
A. Mit "%Lf":
long double ldbl = 1E500;
printf("%Lf", ldbl);
B e i s p i e l p r o g r a m m e
----------------------------------------------------------------------
F. Wie wird MCALC compiliert?
A. Siehe Benutzerhandbuch, Anhang G.
F. Wie wird BGIDEMO compiliert und gestartet?
A. 1. Die folgenden Dateien müssen sich im momentan gesetzten Directory
befinden:
BGIDEMO.C
*.BGI <- die Grafiktreiber
*.CHR <- die Zeichensätze
2. Starten Sie TC mit dem Befehl
TC bgidemo <RETURN>
3. Geben Sie den Tastenbefehl Ctrl-F9.
F. Wie läßt sich mit Turbo C eine .COM-Datei erzeugen?
A. Zusammen mit den DOS-Versionen bis (inklusive) 3.2 wird ein Programm
namens EXE2BIN ("EXE to Binary") ausgeliefert, über das sich
.EXE-Programme des Speichermodells TINY ins .COM-Format umwandeln
lassen.
Wenn Sie EXE2BIN nicht ihr eigen nennen: der zur Kommandozeilen-
Version von Turbo C gehörige Linker läßt sich bei der Compilierung
von TINY-Programmen mit dem neuen Parameter /t aufrufen und spart
den Umweg über eine .EXE-Datei. Der Aufruf von TCC mit
tcc -mt -lt hello
compiliert HELLO.C und erzeugt dann die Datei HELLO.COM. (Das "-l" im
Parameter "-lt" steht für "direkte Weitergabe des folgenden Befehls" -
also "t" - an den Linker, vgl. Referenzhandbuch, Anhang D).
Hinweis: die mathematische Bibliothek von Turbo C arbeitet wegen des
Emulators in jedem Modell mit mehreren Segmenten. TINY-Programme, die
Fließkommazahlen und -routinen benutzen, lassen sich deshalb auch mit
TLINK nicht im .COM-Format speichern.
G r a f i k
----------------------------------------------------------------------
F. Mein Programm endet bei der ersten Grafikfunktion mit der Meldung
BGI Error: graphics not initialized (use 'initgraph')
- und das, obwohl initgraph() definitiv vorher aufgerufen wurde.
A. initgraph() hat seine Funktion aus irgendeinem Grund (höchstwahr-
scheinlich: Grafiktreiber nicht im momentan gesetzten Directory)
nicht erfüllen können. Fügen Sie nach dem Aufruf von initgraph() eine
Prüfung des Ergebnisses von graphresult() ein und ermitteln Sie auf
diese Weise den Fehlerstatus des Grafikpakets:
#include <graphics.h>
main()
{ int gerr; /* für das Ergebnis von graphresult() */
int gdriver = DETECT, gmode;
/* Initialisierung des Grafikpakets über die automatische
Prüfung der Hardware. .BGI- und .CHR-Dateien werden im
Directory C:\TURBOC gesucht:
*/
initgraph(&gdriver, &gmode, "C:\\TURBOC"); /* "\\" ! */
if ((gerr = graphresult()) != grOk)
{ printf("Fehler : %s\n", grapherrormsg(gerr));
exit(1);
}
/* ..... */
}
M a t h e m a t i s c h e s
----------------------------------------------------------------------
F. Die mathematischen Bibliotheksfunktionen liefern völlig unsinnige
Ergebnisse.
A. Vor der Verwendung von Funktionen wie cos() und tan() *müssen*
Sie math.h mit #include in ihr Programm aufnehmen - ansonsten
nimmt der Compiler an, daß diese Routinen den (Standard-)Ergebnistyp
int haben und codiert entsprechende Zuweisungen. Da die meisten
mathematischen Routinen Werte vom Typ double liefern, sind die
Ergebnisse tatsächlich recht wunderlich. Beispiel:
/* FUNKTIONIERT NICHT */ /* O.K. */
#include <math.h>
main() main()
{ {
printf("%f", cos(0)); printf("%f", cos(0));
} }
F. Lassen sich Fließkomma-Fehler durch ein Programm abfangen?
A. Die Funktion signal() ist unter anderem für die Behandlung von
Fehlerbedingungen des Emulators und des 8087 bei direkten Befehlen
vorgesehen; die Funktion matherr() für Bereichsüberschreitungen und
unzulässige Argumente bei Routinen der Laufzeitbibliothek. Die ent-
sprechenden Beschreibungen finden Sie im Referenzhandbuch.
L i n k e r
----------------------------------------------------------------------
F. Was hat die Meldung "Linker Error: Unable to open input file 'C0x.OBJ'"
zu bedeuten?
A. Siehe "Integrierte Entwicklungsumgebung" in dieser Datei.
F. Welchen Grund hat die Meldung "Linker Error: Undefined symbol '_main'
in module C0"?
A. *Jedes* C-Programm muß genau eine Funktion mit dem Namen main
definieren. Diese Funktion wird als "Hauptprogramm" durch den Start-
code aufgerufen.
(Daß der Linker dem Namen _main hier einen Unterstrich voranstellt,
liegt an den allgemeinen Regeln zur Namensgebung in C - main ist
ein global gültiges Symbol).
F. Wieso beharrt der Linker darauf, daß die Funktionen des Grafikpakets
"undefiniert" sind?
A. Siehe "Integrierte Entwicklungsumgebung" und "Kommandozeilen-Version"
in dieser Datei.
F. Was bitte ist ein 'Fixup overflow'?
A. Siehe Benutzerhandbuch, Anhang D.
F. Ich habe versucht, eigene Maschinenroutinen in mein C-Programm ein-
zubinden - mit dem Ergebnis, daß diese Routinen für den Linker
sämtlich "undefiniert" sind.
A. Wahrscheinlich haben Sie einen der beiden folgenden Punkte übersehen:
■ C stellt jedem externen Bezeichner einen Unterstrich voran. Eine
Routine, die im C-Quelltext als MyFunc deklariert ist, muß
im Assembler-Quelltext als _MyFunc erscheinen.
■ Die meisten Assembler arbeiten ohne Unterscheidung zwischen Groß-
und Kleinschreibung, solange sie nicht mit einem entsprechenden
Zusatzparameter (für MASM und TASM: /MX) aufgerufen werden - und
für den Linker von Turbo C sind _MYFUNC und _MyFunc zwei völlig
verschiedene Dinge.
Weitere Details finden Sie in Kapitel 12 des Benutzerhandbuchs.
D i v e r s e s
----------------------------------------------------------------------
F. Wie läßt sich die Standardgröße des Stacks (4096 Bytes) ändern?
A. Die Größe des Bereichs, den Turbo C für den Stack reserviert, wird
zur Laufzeit des Programms durch den Wert der globalen Variablen
_stklen festgelegt. Die folgende Deklaration legt beispielsweise
fest, daß der Stack einen Umfang von 10000 Bytes haben soll:
extern unsigned _stklen = 10000;
Achtung: diese Anweisung darf sich nicht innerhalb einer Funktions-
definition befinden.
F. Mein Programm bricht mit der Meldung 'Stack Overflow!' ab. Was tun?
A. Eine Möglichkeit besteht in einer Vergrößerung des Stacks (siehe
oben); eine weitere in der Deklaration statischer anstelle
dynamischer lokaler Variablen:
main() main()
{ char x[5000]; { static char x[5000];
/* belegt 5000 Bytes auf /* belegt 5000 Bytes im Datensegment */
dem Stack */
} }
ACHTUNG: "Speicherung im Datensegment" bedeutet hier auch: diese Variablen
werden bei Rekursion nicht erneut kopiert.
F. Mein Programm gibt nach seinem (anscheinend ordnungsgemäßen) Ende
die beunruhigende Meldung 'Null pointer assignment' aus.
A. Das bedeutet, daß Ihr Programm entweder eine Zuweisung über einen
(vermutlich nicht initialisierten) Zeiger mit dem Wert NULL ausge-
führt oder den Anfang seines Datensegments auf andere Art und Weise
durcheinander gebracht hat.
Hinweis: Die entsprechende Prüfung (nämlich einen Vergleich vor dem
Rücksprung zu DOS, ob die Konstante 'Copyright Borland International'
am Anfang des Datensegments unversehrt geblieben ist), findet nur in
den Modellen SMALL und COMPACT statt. Bei Verwendung eines anderen
Speichermodells erscheint die Meldung also plötzlich nicht mehr -
was aber nur bedeutet, daß der Programmierfehler nicht automatisch
entdeckt werden konnte.
F. Wieso sind die mit TC.EXE erzeugten .EXE-Dateien größer als bei
einer Compilierung durch die Kommandozeilen-Version?
A. Die integrierte Entwicklungsumgebung bringt standardmäßig
Informationen zur Fehlersuche mit dem integrierten Debugger in der
.EXE-Datei unter (was auf die Ausführungsgeschwindigkeit übrigens
keinen Einfluß hat). Diese zusätzlichen Informationen lassen sich
mit Debug/Source debugging..None unterdrücken.
F. Der Compiler meldet sich nach einem #include <dos.h> mit
"Declaration syntax error".
A. Sie haben O/C/Source/ANSI keywords only auf ON gesetzt. Dieser Schalter
muß bei Verwendung von DOS.H auf OFF bleiben, weil diese Datei einige
reservierte Wörter enthält, die nicht dem ANSI-Standard entsprechen.
F. Ich habe ein Programm mit dynamischer Speicherverwaltung via malloc()
und/oder calloc() geschrieben, das in den kleinen Datenmodellen
(TINY, SMALL und MEDIUM) anstandslos funktioniert. Wenn ich aber
eines der "großen" Modelle (COMPACT, LARGE oder HUGE) verwende,
hängt sich das System auf.
A. In diesen Modellen liefern malloc(), calloc() usw. FAR-Zeiger zurück -
und deshalb *müssen* Sie die Datei ALLOC.H mit in Ihr Programm
aufnehmen. Ansonsten erwartet der Compiler den (Standard-)Ergebnistyp
int (= NEAR-Zeiger).
F. Beim Einbinden eines selbstgeschriebenen Maschinenprogramms moniert
der Linker die entsprechenden Symbole als "undefiniert".
A. Siehe "Linker" in dieser Datei.
F. Kann ich mehr als 64 KByte globaler Variablen deklarieren?
A. In allen Modellen außer HUGE dürfen globale und statische Variablen
des *gesamten* Programms maximal 64 KByte belegen. Im Modell HUGE
kann jedes *Modul* bis zu 64 KByte Daten definieren.
F. Wie läßt sich ein Array deklarieren, das mehr als 64 KByte Gesamt-
umfang hat?
A. Arrays mit einem Umfang von mehr als 64 KByte müssen zur Laufzeit
des Programms dynamisch belegt und über HUGE-Zeiger adressiert werden,
sind aber in jedem der "großen Datenmodelle" möglich (d.h. nicht nur
im Modell HUGE). Ein Array, das man normalerweise als
char array[1024][128];
deklarieren würde, wird hier folgendermaßen formuliert:
#include <alloc.h>
char (huge *array)[128]; /* ein HUGE-Zeiger auf ein Array mit
128 Zeigerelementen */
main()
{
array = farcalloc(sizeof(*array), 1024);
}
Der Aufruf von farcalloc belegt für jedes der 128 Elemente des
Arrays 1024 Bytes Platz auf dem Heap. Nach dieser Initialisierung
läßt sich das Array in derselben Weise wie eine statische Variable
adressieren. Eine Zuweisung wie
i = array[30][56];
setzt die Variable i auf den Wert des 31. Elements des 57. Arrays.
F. Wie lassen sich mit Turbo C geschriebene Routinen in ein Turbo Pascal-
Programm einbinden?
A. Siehe CPASDEMO.PAS und CPASDEMO.C auf der Originaldiskette 6 in der
Datei EXAMPLES.ARC. (Diese Datei wird von INSTALL via UNPACK auto-
matisch ins "Turbo directory" ausgepackt).
F. Wie lassen sich mit Turbo C geschriebene Routinen in ein Clipper-
Programm einbauen?
A. Falls sich dabei irgendwelche Probleme ergeben sollten, müssen wir
auf die Hotline der Firma Nantucket verweisen (von der dieser dBASE-
Compiler stammt).