2.1 Wie erzeuge ich ein Programm? 2.1.1 MS-DOS System 2.1.2 UNIX System 2.2 Aufruf und Umgang mit dem Compiler in den Übungen 2.3 INCLUDE-Dateien und Bibliotheksfunktionen von C
Dieses Kapitel ist das einzige Kapitel, das sich notwendigerweise auf einen bestimmten Rechner und sogar auf einen bestimmten C-Übersetzer beziehen muß, da die Bedienung der einzelnen C-Übersetzer sehr unterschiedlich sein kann. Wir werden hier auch nur C-Compiler betrachten und uns nicht mit C-Interpretern beschäftigen, bei denen die Programmerzeugung etwas anders aussieht.
2.1 Wie erzeuge ich ein Programm?
Der grundsätzliche Weg von der Idee zum lauffähigen Programm kann so gekennzeichnet werden:
Editor ---> C-Compiler ---> Linker ---> Programm
Mit dem Editor wird eine Quellencodedatei erzeugt, die vom C-Compiler in eine Objektdatei übersetzt wird. Aus dieser erzeugt der Linker unter Verwendung der C-Bibliothek dann das lauffähige Programm. Oftmals sind die Funktionen von Compiler und Linker in einem Programm zusammengefaßt.
Auf einem MS-DOS System gibt es z.B. die Editoren bzw. Textverarbeitungsprogramme EDLIN, EDIT und WORD. Der Compiler hat je nach Hersteller einen anderen Namen. Zum Linken wird meist der MS-DOS Linker verwendet. Die Dateinamen haben üblicherweise folgende Dateinamenergänzungen:
.c für den Quellencode
.h für Include-Dateien
.obj für den Objektcode
.exe für das lauffähige Programm
Mit dem Aufkommen von Programmierumgebungen für PCs (Zorlite C, Microsoft C und Turbo C) hat der Benutzer eine komfortable Umgebung zur Erzeugung und zum Austesten von Programmen. Sie sind (fast) selbsterklärend und arbeiten mit Pull-Down-Menüs. Weiterhin verfügen diese Umgebungen über einen integrierten Editor und eine On-Line-Hilfe-Funktion. Sie zeigen Syntaxfehler im Quellencode an. Dies ist insbesondere für Anfänger in der Programmiersprache C sehr wertvoll, da Fehler somit leicht gefunden werden. Meist verfügen Sie auch über einen Debugger, mit dem man das ablaufende Programme an beliebig wählbaren Stellen anhalten, Variablen abfragen und dann weiterlaufen lassen kann. Damit lassen sich auch Laufzeitfehler (insbesondere bei der Zeigerverarbeitung) aufspüren.
Auf einem UNIX System kann man als Editor z.B. vi, emacs oder pine verwenden. Der C-Compiler schließt hier die Linkfunktion mit ein und heißt CC. Der Compiler entspricht meist der ANSI-Norm. Die Dateinamen haben üblicherweise folgende Dateinamenergänzungen:
.c für den Quellencode
.h für Include-Dateien
.o für den Objektcode
a .out für das lauffähige Programm
Die Bibliotheksdateien befinden sich meist im Verzeichnis /usr/lib und die Include-Dateien stehen in /usr/lib/include.
Auf einem UNIX System gibt es weiterhin einen C-Syntaxchecker. Dieses Programm heißt LINT und erzeugt keinen Code, unterwirft das Quellenprogramm aber einer ausführlichen Syntaxanalyse, die der normale C-Compiler CC nicht bietet. Ein Programm, das von LINT ohne Fehlermeldung bearbeitet wurde, kann als höchst portabel betrachtet werden. Schließlich gibt es, je nach System, auch eine symbolischen Debugger SDB. Nähere Informationen zu cc, lint und sdb kann man auf einem UNIX System mit Hilfe des man-Kommandos erhalten.
2.2 Aufruf und Umgang mit dem Compiler in den Übungen
Der grundlegende Aufruf für den Compiler lautet:
cc Dateiname.c
Damit wird das Quellenprogramm in der Datei "Dateiname.c" übersetzt und anschließend automatisch der Linker aufgerufen. Es entsteht im allgemeinen keine Objektdatei (mit der Dateinamenerweiterung .o) sondern nur das fertige Programm in der Datei a.out. Wandelt man den obigen Aufruf wie folgt ab:
cc -o Dateiname1 Dateiname2.c
so wird das fertige Programm in die Datei "Dateiname1" geschrieben. Die Dateinamen "Dateiname1" und "Dateiname2" können auch gleich sien. Die Rechte zur Programmausführung für den Benutzer werden in beiden Fällen automatisch gesetzt.
Es empfiehlt sich, fertige Programme und Quellencodedateien in einem Unterverzeichnis des eigenen Home-Verzeichnisses aufzubewahren, damit man einen besseren Überblick behält.
2.3 INCLUDE-Dateien und Bibliotheksfunktionen von C
Wichtig zur Programmerzeugung sind weiterhin die C-Bibliothek und die Header-(Include-)Dateien. Deren Namen sind, da sie fast in jedem C-Programm benötigt werden, standardisiert. Ebenso natürlich die Namen der Bibliotheksfunktionen. Die folgenden Listen der Include-Dateien und der Bibliotheksfunktionen beziehen sich auf TURBO C 2.0. Sie werden hier angegeben, um Ihnen einen Gesamtüberblick zu geben. Viele Funktionen und Include-Dateien sind aber nicht bei allen C Compilern vorhanden (insbesondere natürlich nicht die MS-DOS spezifischen).
Hier sind zunächst die Include-Dateien aufgelistet. Das Hauptanwendungsgebiet der jeweiligen Include-Datei ist ebenfalls angegeben.
ALLOC.H Speicherverwaltung
ASSERT.H Assert-Debugging-Makro
BIOS.H BIOS-Funktionen
CONIO.H Ein-/Ausgabe für die DOS-Konsole
CTYPE.H Zeichenklassifizierung und -umwandlung
DIR.H Directory-Verwaltung
DOS.H DOS-Funktionen
ERRNO.H Mnemonics für Fehlercodes
FCNTL.H Konstantendefinitionen für OPEN (von Dateien)
FLOAT.H Parameter für Gleitpunktroutinen
IO.H Low-Level Ein-/Ausgaberoutinen
LIMITS.H Informationen zu Grenzwerten versch. Parameter
MATH.H Mathematik-Funktionen
MEM.H Speicher-Manipulations-Funktionen
PROCESS.H Prozeßverwaltung
SETJMP.H Routinen für FAR-Sprünge
SHARE.H Parameter für File-Sharing
SIGNAL.H Abfrage von Betriebssystem-Flaggs
STDARG.H Makros für variable Anzahl von Funktionsparametern
STDDEF.H Definition gebräuchlicher Datentypen und Makros
STDIO.H Standard Ein-/Ausgabe
STDLIB.H oft beötigte gebräuchliche Funktionen zur Umwandlung, Suche und zum Sortieren von Daten
STRING.H Zeichenketten-Funktionen
SYS\STAT.H Symbolische Konstanten für Dateioperationen
TIME.H Zeit-Funktionen
VALUES.H wichtige Konstanten einschließlich Maschinenabhängigkeiten
Es folgt nun eine Liste der Bibliotheksfunktionen. Sie sind zu Kategorien zusammengefaßt, um ein schnelleres Suchen nach einer Funktion für eine bestimmte Aufgabe zu ermöglichen. Manche Funktionen kommen mehrfach vor, da sie verschiedenen Kategorien zugeordnet werden können. Die Kategorien sind alphabetisch geordnet; ebenso die Funktionsnamen innerhalb der einzelnen Kategorien.
Die Funktionsnamen geben oft schon einen Hinweis auf ihre Funktion. Weitergehende Informationen erhält man durch das Schreiben des Namens der Funktion, Positionieren des Cursors auf diesen Namen und die Anfrage nach Syntaxhilfe (Funktionstaste LOOKUP). Eine ausführliche Beschreibung der Funktionen findet man im Referenzhandbuch für den jeweiligen Compiler.
Diagnose-Routinen (Prototypen in assert.h, math.h und errno.h)
assert matherr perror
Directory-Routinen (Prototypen in dir.h)
chdir findfirst findnext fnmerge fnsplit getcurdir
getcwd getdisk mkdir mktemp rmdir searchpath
setdisk
Ein-/Ausgabe-Routinen (Prototypen überwiegend in stdio.h und io.h, aber auch in conio.h und signal.h)
access cgets chmod _chmod clearerr _close
close cprintf cputs creat _creat creatnew
creattemp dup dup2 eof fclose fcloseall
fdopen feof ferror fflush fgetc fgetchar
fgets filelength fileno flushall fopen fprintf
fputc fputchar fputs fread freopen fscanf
fseek ftell fwrite getc getch getchar
getche getftime getpass gets getw gsignal
ioctl isatty kbhit lock lseek _open
open perror printf putc putch putchar
puts putw read _read remove rename
rewind scanf setbuf setftime setmode setvbuf
sopen sprintf sscanf ssignal strerror tell
ungetc ungetch unlock vfprintf vfscanf vsprintf
vsscanf _write write
Interface-Routinen für DOS, BIOS und 8086 (Prototypen überwiegend in dos.h, aber auch in bios.h)
absread abswrite bdos bdosptr bioscom biosdisk
biosequip bioskey biosmemory biosprint biostime country
ctrlbrk disable dosexterr enable FP_OFF FP_SEG
freemem geninterrupt getcbrk getdfree getdta getfat
getfatd getpsp getvect getverify harderr hardresume
hardretn inport inportb int86 int86x intdos
intdosx intr keep MK_FP outport outportb
parsfnm peek peekb poke pokeb randbrd
randbwr segread setdta setvect setverify sleep
unlink
Klassifizierungs-Routinen (Prototypen in ctype.h)
isalnum isalpha isascii iscntrl isdigit isgraph
islower isprint ispunct isspace isupper isxdigit
Konvertierungs-Routinen (Prototypen überwiegend in stdlib.h, einige auch in ctype.h)
atof atoi atol ecvt fcvt gcvt
itoa ltoa strtod strtol toascii _tolower
tolower _toupper toupper uitoa
Mathematik-Routinen (Prototypen überwiegend in math.h, aber auch in float.h und stdlib.h)
abs acos asin atan atan2 atof
atoi atol cabs ceil_ clear87 _control87
cos cosh ecvt exp fabs fcvt
floor fmod _fpreset87 frexp gcvt hypot
itoa labs ldexp log log10 ltoa
_matherr matherr modf poly pow pow10
rand sin sinh sqrt srand _status87
strtod strtol tan tanh uitoa
Prozeß-Routinen (Prototypen in process.h)
abort execl execle execlp execlpe execv
execve execvp execvpe _exit exit spawnl
spawnle spawnlp spawnlpe spawnv spawnve spawnvp
spawnvpe system
Sonstige-Routinen (Prototypen in setjmp.h)
setjmp longjmp
Speicher-Verwaltungs-Routinen (Prototypen überwiegend in alloc.h, aber auch in stdlib.h und dos.h)
allocmem brk calloc coreleft farcalloc farcoreleft
farmalloc farrealloc free malloc realloc sbrk
setblock
Standard-Routinen (Prototypen in stdlib.h)
abort abs atexit atof atoi atol
bsearch calloc ecvt _exit exit fcvt
free gcvt getenv itoa labs lfind
lsearch ltoa malloc putenv qsort rand
realloc srand strtod strtol swab system
uitoa
String- und Speicher-Manipulations-Routinen (Prototypen überwiegend in string.h, aber auch in mem.h)
memcpy memchr memcmp memicmp memmove memset
movebytes movedata movmem setmem stpcpy strcat
strchr strcmp strcpy strcspn strdup strerror
stricmp strlen strlwr strncat strncmp strncpy
strnicmp strnset strpbrk strrchr strrev strset
strspn strstr strtok strtol strtoul strupr
Zeit- und Datums-Routinen (Prototypen in time.h und dos.h)
memcpy memchr memcmp memicmp memmove memset
asctime ctime difftime dostounix getdate gettime
gmtime localtime setdate settime stime tzset
unixtodos