C-Programmierung unter Linux/UNIX/Windows - . Helmut Herold Dr. Jrg Arndt C-Programmierung unter Linux/UNIX/Windows Beispiele, Anwendungen, Programmiertechniken

  • Published on
    06-Feb-2018

  • View
    213

  • Download
    1

Embed Size (px)

Transcript

  • Dr. Helmut HeroldDr. Jrg Arndt

    C-Programmierung unterLinux / UNIX / Windows

    Beispiele, Anwendungen,Programmiertechniken

  • Alle in diesem Buch enthaltenen Programme, Darstellungen und Informationen wurden nach bestem Wis-sen erstellt und mit Sorgfalt getestet. Dennoch sind Fehler nicht ganz auszuschlieen. Aus diesem Grundist das in dem vorliegenden Buch enthaltene Programm-Material mit keiner Verpflichtung oder Garan-tie irgendeiner Art verbunden. Autoren und Verlag bernehmen infolgedessen keine Verantwortung undwerden keine daraus folgende Haftung bernehmen, die auf irgendeine Art aus der Benutzung diesesProgramm-Materials, oder Teilen davon, oder durch Rechtsverletzungen Dritter entsteht.

    Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Buch be-rechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne derWarenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wren und daher von jedermannverwendet werden drften.

    Alle Warennamen werden ohne Gewhrleistung der freien Verwendbarkeit benutzt und sind mglicher-weise eingetragene Warenzeichen. Der Verlag richtet sich im Wesentlichen nach den Schreibweisen derHersteller. Andere hier genannte Produkte knnen Warenzeichen des jeweiligen Herstellers sein.

    Dieses Werk ist urheberrechtlich geschtzt.Alle Rechte, auch die der bersetzung, des Nachdruckes und der Vervielfltigung des Buches, oder Teilendaraus, vorbehalten. Kein Teil des Werkes darf ohne schriftliche Genehmigung des Verlages in irgendei-ner Form (Druck, Fotokopie, Microfilm oder einem anderen Verfahren), auch nicht fr Zwecke der Unter-richtsgestaltung, reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfltigtoder verbreitet werden.

    Bibliografische Information Der Deutschen Bibliothek

    Die Deutsche Bibliothek verzeichnet diese Publikation in der DeutschenNationalbibliografie; detaillierte bibliografische Daten sind im Internet berhttp://dnb.ddb.de abrufbar.ISBN 3-938626-17-7

    2010 Nicolaus Millin Verlag GmbH, Lohmar (http://www.millin.de)Umschlaggestaltung: millin Verlag, http://www.millin.deGesamtlektorat: Nicolaus MillinFachlektorat: Dieter Bloms, Jrg Dippel, Klaas Freitag, Bruno Gerz, Bernhard Hoelcker, Bjrn Jacke, An-dreas Jaeger, Dirk Pankonin, Wolfgang Rosenauer, Christian Steinrcken, Peter VarkolySatz: LATEXDruck: druckhaus kthen GmbH, Kthen (http://www.koethen.dePrinted in Germany on acid free paper.

  • Inhaltsverzeichnis

    1 Einfhrendes Beispiel 3

    1.1 Erste wesentliche C-Regeln . . . . . . . . . . 3

    1.2 Zeilen-Kommentare mit // (neu in C99) . . . . . . . 5

    1.3 Gute Lesbarkeit von Programmen . . . . . . . . . 5

    1.4 Vermeiden von geschachtelten Kommentaren . . . . . . 6

    2 Elementare Datentypen 7

    2.1 Die Grunddatentypen in C . . . . . . . . . . 7

    2.2 Wertebereiche fr die einzelnen Datentypen . . . . . . . 9

    2.3 Fallgrube: Verlust von Bits bei zu groen Zahlen . . . . . . 10

    3 Konstanten 11

    3.1 char-Konstanten . . . . . . . . . . . . 11

    3.2 Ganzzahlige Konstanten . . . . . . . . . . . 11

    3.3 Gleitpunktkonstanten . . . . . . . . . . . 12

    4 Variablen 13

    4.1 Variablen und die C-Regeln fr Variablennamen . . . . . . 13

    4.2 Tipps zur Wahl der Variablennamen . . . . . . . . 14

    4.3 Deklaration von Variablen . . . . . . . . . . 14

    4.4 Tipp: Variablen bereits bei Deklaration dokumentieren . . . . 16

    5 Ausdrcke und Operatoren 17

    5.1 Der einfache Zuweisungsoperator . . . . . . . . . 17

    5.1.1 Allgemeines zum einfachen Zuweisungsoperator . . . . 17

    5.1.2 Initialisierung von Variablen . . . . . . . . 19

    5.2 Arithmetische Operatoren . . . . . . . . . . 19

    5.2.1 Die arithmetischen Operatoren . . . . . . . . 19

    V

  • Inhaltsverzeichnis

    5.2.2 Die C-Begriffe Ausdruck und Anweisung . . . . . . 20

    5.2.3 Ausgabe von int-Variablen und -Ausdrcken . . . . . 21

    5.2.4 Ausgabe von Gleitpunkt-Variablen und -Ausdrcken . . . 21

    5.2.5 Fallgrube: Ganzzahl- statt Gleitpunktdivision . . . . . 22

    5.3 Vergleichsoperatoren . . . . . . . . . . . 23

    5.3.1 Die unterschiedlichen Vergleichsoperatoren . . . . . 23

    5.3.2 Die zwei Wahrheitswerte von Vergleichen . . . . . . 23

    5.3.3 Prioritten der Vergleichsoperatoren . . . . . . . 23

    5.4 Logische Operatoren . . . . . . . . . . . 24

    5.4.1 TRUE und FALSE in C . . . . . . . . . . 24

    5.4.2 Der Datentyp _Bool (neu in C99) . . . . . . . 24

    5.4.3 Die C-Operatoren fr NOT, AND und OR im berblick . . . 25

    5.4.4 Der Negations-Operator ! . . . . . . . . . 25

    5.4.5 Der AND-Operator && . . . . . . . . . 26

    5.4.6 Der OR-Operator || . . . . . . . . . . 26

    5.4.7 Die Prioritt der logischen Operatoren . . . . . . 26

    5.4.8 Keine unntige Auswertung rechts von &&und || . . . . 27

    5.4.9 bung: berprfungen mit logischen Operatoren . . . . 28

    5.5 Bit-Operatoren . . . . . . . . . . . . . 28

    5.5.1 Bitweise Invertierung mit ~ . . . . . . . . . 28

    5.5.2 Bitweise AND-Verknpfung mit & . . . . . . . 30

    5.5.3 Bitweise OR-Verknpfung mit | . . . . . . . . 31

    5.5.4 Bitweise XOR-Verknpfung mit ^ . . . . . . . 33

    5.5.5 Bit-Operatoren nur fr ganzzahlige Datentypen erlaubt . . . 34

    5.5.6 Fallgruben . . . . . . . . . . . . 34

    5.5.7 bung: berprfungen mit Bit-Operatoren . . . . . 36

    5.6 Shift-Operatoren . . . . . . . . . . . . 37

    5.6.1 Die beiden Shift-Operatoren . . . . . . 37

    5.6.2 Shift-Operatoren nur fr ganzzahlige Datentypen erlaubt . . 38

    5.6.3 Prioritt der Shift-Operatoren . . . . . . . . 38

    5.7 Zusammengesetzte Zuweisungsoperatoren . . . . . . . 39

    5.7.1 Die zusammengesetzten Zuweisungsoperatoren . . . . 39

    5.8 Inkrement- und Dekrement-Operatoren . . . . . . . . 40

    5.8.1 Inkrementieren und Dekrementieren mit ++ und -- . . . . 40

    5.8.2 Prfix- und Postfix-Schreibweise fr ++ und -- . . . . . 40

    5.8.3 ++ und -- ist nur fr Variablen erlaubt . . . . . . 42

    5.8.4 ++ und -- ist nicht auf linken Seite einer Zuweisung erlaubt . . 42

    VI

  • Inhaltsverzeichnis

    5.9 Priorittstabelle fr Operatoren . . . . . . . . . 42

    5.10 Assoziativitt der Operatoren . . . . . . . . . . 43

    5.11 Erlaubte und unerlaubte Operationen fr C-Datentypen . . . . 43

    5.12 Prioritt und Auswertungszeitpunkt bei ++ und -- . . . . . 43

    5.13 Fallgrube: Zugriff auf nicht vorbesetzte Variablen . . . . . . 45

    5.14 bungen . . . . . . . . . . . . . . 46

    6 Symbolische Konstanten 47

    6.1 Konstanten-Definition mit #define . . . . . . . . . 47

    6.1.1 Die Direktive #define . . . . . . . . . . 47

    6.1.2 Regeln fr Konstanten-Namen bei #define . . . . . . 49

    6.1.3 Konstanten machen Programm leicht nderbar . . . . . 49

    6.2 Konstanten-Definition mit const . . . . . . . . . 49

    7 Ein- und Ausgabe 51

    7.1 Headerdateien und #include . . . . . . . . . . 51

    7.1.1 Bibliotheken und Headerdateien . . . . . . . 51

    7.1.2 Eigene Headerdateien . . . . . . . . . . 52

    7.2 Ein- und Ausgabe eines Zeichens . . . . . . . . . 53

    7.2.1 getchar() und putchar() . . . . . . . . . 53

    7.2.2 Gepufferte Eingabe bei getchar() . . . . . . . . 53

    7.2.3 Puffer-Bereinigung mit Dummy getchar() . . . . . . 57

    7.2.4 Puffer-Bereinigung ist nicht immer notwendig . . . . . 58

    7.2.5 Fallgrube: Zahlen nicht mit getchar() einlesen . . . . . 60

    7.2.6 Die Headerdatei . . . . . . . . 60

    7.2.7 Einfache Makros . . . . . . . . . . . 62

    7.3 Die Ausgabe mit printf() . . . . . . . . . . . 67

    7.3.1 Die Funktion printf() . . . . . . . . . . 67

    7.3.2 Fallgruben . . . . . . . . . . . . 74

    7.3.3 Tipps . . . . . . . . . . . . . 75

    7.4 Die Eingabe mit scanf() . . . . . . . . . . . 77

    7.4.1 Die Funktion scanf() . . . . . . . . . . 77

    7.4.2 Fallgruben . . . . . . . . . . . . 83

    7.4.3 Die Headerdatei . . . . . . . . . 86

    7.4.4 Fallgrube: Vergessen von #include . . . . . 88

    8 Datentypumwandlungen 91

    8.1 Implizite Datentypumwandlungen . . . . . . . . 91

    VII

  • Inhaltsverzeichnis

    8.1.1 Der sizeof-Operator . . . . . . . . . . 91

    8.1.2 Implizite Datentypumwandlungen . . . . . . . 93

    8.1.3 Fallgrube: Zuweisen von Ganzzahlausdrcken an Gleitpunktvariablen 97

    8.2 Explizite Datentypumwandlungen . . . . . . . . . 98

    8.2.1 Explizite Datentypumwandlungen mit cast-Operator . . . 98

    8.2.2 Fallgruben . . . . . . . . . . . . 98

    9 Die Headerdateien

  • Inhaltsverzeichnis

    15 Die for-Anweisung 129

    15.1 Die for-Anweisung . . . . . . . . . . . . 129

    15.2 Die for-Schleife und der Komma-Operator . . . . . . . 133

    15.3 Fallgrube: Semikolon am Ende des for-Schleifenkopfs . . . . . 136

    15.4 Geschachtelte Schleifen . . . . . . . . . . . 137

    15.5 Eine endlose for-Schleife . . . . . . . . . . . 143

    15.6 for bei Durchlufen mit festen Schrittweiten . . . . . . . 143

    15.7 Variablendeklaration im for-Schleifenkopf (neu in C99) . . . . 146

    15.8 Programmiertechniken . . . . . . . . . . . 146

    15.8.1 Anhalten einer Bildschirmausgabe . . . . . . . 146

    15.8.2 Zeilenvorschbe bei geschachtelten Schleifen . . . . . 149

    15.8.3 Kombinieren mit for-Schleifen . . . . . . . . 150

    15.8.4 Zwischeninformationen bei rechenintensiven Programmen . . 152

    15.8.5 Merker in for-Schleifen bei Eintreten von Ereignissen . . . 153

    15.9 Fallgruben . . . . . . . . . . . . . 154

    15.9.1 Niemals die Laufvariable im Schleifenkrper ndern . . . 154

    15.9.2 Gleitpunktzahlen niemals auf Gleichheit prfen . . . . 157

    15.9.3 Laufvariable einer for-Schleife luft ber Endwert hinaus . . 159

    16 Die while-Anweisung 161

    16.1 Die while-Anweisung . . . . . . . . . . . 161

    16.2 Programmiertechniken . . . . . . . . . . . 163

    16.2.1 while bei unbekannter Zahl von Schleifendurchlufen . . . 163

    16.2.2 Konsistenzprfungen bei Eingaben . . . . . . . 165

    16.2.3 Die Konstante EOF . . . . . . . . . . 166

    16.2.4 Minimum und Maximum in einer Zahlenfolge . . . . . 167

    16.3 Zufallszahlen in C . . . . . . . . . . . . 168

    17 Die do. . . while-Anweisung 175

    17.1 Die do. . . while-Anweisung . . . . . . . . . . 175

    17.2 Programmiertechniken . . . . . . . . . . . 177

    17.2.1 do. . . while-Schleifen nicht so oft wie while-Schleifen . . . 177

    17.2.2 Abschlieendes } while immer in einer Zeile . . . . 178

    18 Die break-Anweisung 179

    18.1 Die break-Anweisung . . . . . . . . . . . 179

    18.2 break bewirkt Verlassen einer Schleifenebene . . . . . . 180

    18.3 Programmiertechniken . . . . . . . . . . . 180

    IX

  • Inhaltsverzeichnis

    18.3.1 Sofortiges Verlassen von Schleifen und switch . . . . . 180

    18.3.2 Endlosschleifen und break . . . . . . . . . 182

    19 Die continue-Anweisung 183

    19.1 Die continue-Anweisung . . . . . . . . . . . 183

    19.2 Programmiertechniken . . . . . . . . . . . 184

    19.2.1 continue nur im uersten Notfall . . . . . . . 184

    19.2.2 Korrekte Programme mssen auch schnell sein . . . . . 185

    19.3 Datums- und Zeitangaben () . . . . . . . . 189

    19.3.1 Konstanten und Datenytpen . . . . . . . . 189

    19.3.2 Funktionen . . . . . . . . . . . . 189

    19.3.3 Beispiele zu Funktionen aus . . . . . . 192

    20 Marken und die goto-Anweisung 197

    20.1 Marken und die goto-Anweisung . . . . . . . . . 197

    20.2 Programmiertechniken . . . . . . . . . . . 197

    20.2.1 goto nur im uersten Notfall . . . . . . . . 197

    20.2.2 Lesbarere und schnellere Programme mit goto . . . . . 198

    21 Grafikprogrammierung unter Linux 199

    21.1 Benutzung von LCGI . . . . . . . . . . . 199

    21.2 Grafikmodus ein- und ausschalten . . . . . . . . . 200

    21.3 Eingaben im Grafikmodus . . . . . . . . . . 200

    21.4 Bildschirm-, Farben- und Pixel-Operationen . . . . . . . 204

    21.5 Positionieren, Linien zeichnen und Farbe einstellen . . . . . 207

    21.6 Figuren zeichnen und ausfllen . . . . . . . . . 209

    21.7 Einstellungen fr Textausgaben . . . . . . . . . 215

    21.8 Bilder laden, Bildteile speichern und einblenden . . . . . . 217

    21.9 Kuchenstcke malen . . . . . . . . . . . 220

    21.10Grafikpaket neu bzw. anders einrichten . . . . . . . . 222

    21.11Arbeiten mit mehreren Zeichenfenstern . . . . . . . . 223

    21.12Programmierung der Maus . . . . . . . . . . 223

    21.13Transformation mathematischer Koordinaten . . . . . . 226

    22 Funktionen 231

    22.1 Allgemeines zu Funktionen . . . . . . . . . . 231

    22.1.1 Allgemeines Beispiel zu Funktionen . . . . . . . 231

    22.1.2 Die Begriffe Parameter und Argumente . . . . . . 233

    X

  • Inhaltsverzeichnis

    22.1.3 Bibliotheken und Headerdateien . . . . . . . 233

    22.2 Erstellen eigener Funktionen . . . . . . . . . . 234

    22.2.1 Definition von Funktionen in C89/C99 . . . . . . 234

    22.2.2 Definition von Funktionen in Alt-C . . . . . . . 237

    22.2.3 Die return-Anweisung . . . . . . . . . . 238

    22.2.4 Funktionen ohne Rckgabewert . . . . . . . . 238

    22.2.5 Forward-Deklarationen . . . . . . . . . 239

    22.2.6 Funktions-Prototypen . . . . . . . . . . 242

    22.2.7 Implizite Datentypumwandlung beim Funktionsaufruf . . . 246

    22.2.8 Typische Anwendungsgebiete von Funktionen . . . . . 248

    22.3 Die Parameter von Funktionen . . . . . . . . . 253

    22.3.1 Leere Parameterliste durch Angabe von void . . . . . 253

    22.3.2 Bei Funktionsaufrufen findet nur Wertbergabe statt . . . 253

    22.3.3 Call by reference . . . . . . . . . . . 258

    22.3.4 Auswertung der Argumente findet vor Funktionsaufruf statt . . 260

    22.3.5 Fallgruben . . . . . . . . . . . . 261

    22.4 Ellipsen-Prototypen fr Funktionen mit variabler Argumentzahl . . 263

    22.4.1 Reihenfolge der Argument-Ablage im Stack . . . . . 263

    22.4.2 Ellipsen-Prototypen . . . . . . . . . . 264

    22.4.3 Abarbeiten variabel langer Argumentlisten . . . . . 264

    22.4.4 Verfahren zum Abarbeiten variabel langer Argumentlisten . . 265

    22.4.5 Fallgruben . . . . . . . . . . . . 269

    22.5 Neuheiten in C99 . . . . . . . . . . . . 270

    22.5.1 Inline-Funktionen . . . . . . . . . . 270

    22.5.2 Der vordefinierte Name __func__ . . . . . . . 271

    22.5.3 Keine Untersttzung von implizitem int . . . . . . 272

    22.5.4 Keine impliziten Funktionsdeklarationen . . . . . . 272

    22.5.5 Einschrnkungen bei return . . . . . . . . 272

    22.6 Rekursive Funktionen . . . . . . . . . . . 273

    22.6.1 Allgemeines zu rekursiven Funktionen . . . . . . 273

    22.6.2 Einige typische Anwendungen fr die Rekursion . . . . 276

    22.7 Zeiger auf Funktionen . . . . . . . . . . . 280

    22.7.1 Zeiger auf Funktionen . . . . . . . . . . 280

    22.7.2 Typische Anwendungen . . . . . . . . . 283

    23 Speicherklassen und Modultechnik 287

    23.1 Gltigkeitsbereich, Lebensdauer, Speicherort . . . . . . 287

    XI

  • Inhaltsverzeichnis

    23.1.1 Gltigkeitsbereich . . . . . . . . . . 287

    23.1.2 Lebensdauer . . . . . . . . . . . . 291

    23.1.3 Speicherort . . . . . . . . . . . . 292

    23.1.4 Gltigkeit, Lebensdauer und Speicherort im berblick . . . 292

    23.1.5 bung: Ausgabe des Programms block3.c . . . . . 293

    23.2 Schlsselwrter extern, auto, static und register . . . . . . 293

    23.2.1 Das Schlsselwort extern . . . . . . . . . 293

    23.2.2 Das Schlsselwort auto . . . . . . . . . 296

    23.2.3 Fallgrube: Niemals Adressen von auto-Variablen zurckgeben . 303

    23.2.4 Das Schlsselwort static . . . . . . . . . 304

    23.2.5 Das Schlsselwort register . . . . . . . . . 310

    23.3 Die Schlsselwrter const und volatile . . . . . . . . 310

    23.3.1 Das Schlsselwort const . . . . . . . . . 310

    23.3.2 Das Schlsselwort volatile . . . . . . . . . 312

    23.3.3 Kombination von const und volatile . . . . . . . 313

    23.4 Modultechnik und Information Hiding . . . . . . . . 314

    23.4.1 Linker und Compiler . . . . . . . . . . 317

    23.4.2 Beispiel: Simulation von Tur...

Recommended

View more >