ESP Tutorium Studienassistent: Ewald Moitzi E-Mail: prog-tutor-ewald@iicm.edu Gruppe 9
Plan für Heute Zip am pluto Datentypen? If, Schleifen Debugging Fehlerquellen Compiler-Fehlermeldungen Fehlersuche
Feedback hw1 Spezifikationstreue Zusätzliche Ordner Unvollständige/falsche Abgabe Dateinamen: hw1, hw1.c, hw1.zip oder.tar.gz
Zip am Pluto zip <zipfile> <file1> <file2> Bsp: zip hw1.zip hw1.c hw1 unzip <zipfile>
If / Schleifen Coding...
Debugging Ablauf per printf-ausgaben verfolgen IDE (zb eclipse) gdb (Kommandozeile) Mit -g kompilieren gdb <binary> cgdb wo vorhanden (nicht am pluto) Textgrafikfenster
gdb Befehle break, b run Setzt einen Breakpoint (programm wird angehalten) break <functionname> oder break <line> Startet das Programm step, s nächste Zeile, springt in Unterfunktionen next, n Nächste Zeile, springt über Funktionen
Gdb Befehle print <variable> Gibt den Wert der variable aus backtrace, bt Aufrufliste Durch <Enter> wird der letzte Befehl wiederholt
Fehlerquellen sprechende variablen namen! (nicht h, b, i) Zuweisungsoperator bei Deklaration immer gleich Wert zuweisen int count = 5; //good kein == if (count = 5) Modulo vs. Real-Division vs. Integer-Division 7 % 3 =? 7 / 3 =? 7. / 3 =?
Fehlerquellen Faustregel: bei arithmetischen Operationen bestimmen Operanden den Ergebnistyp (float, int) Pre- und Post-Increment a = count++; // zuweisen, erhöhen a = ++count; // erhöhen, zuweisen (++x == x++) - T/F?!
Fehlerquellen Short Circuit Evaluation: von links nach rechts wird so wenig wie möglich ausgewertet Möglichst keine Werte in If-Konstrukten verändern! int a = 1;... if (a == 1 b++) //b won t get incremented Nicht Bit- Operatoren und Logische-Operatoren verwechseln! && vs. &, vs.,! vs. ~
Fehlerquellen Klammern if (b == 2) { if (a == 3) formathdd(); } else donothing(); Switch/Case/Break switch(a) { case 1: playmusic(); case 2: stopmusic();...
Fehlerquellen Klammern if (b == 2) { if (a == 3) formathdd(); } else donothing(); Switch/Case/Break switch(a) { case 1: playmusic(); break; //very important case 2: stopmusic();...
Fehlerquellen Off-by-one Error int count; int int_array[5] = {1,2,3,4,5}; for (count = 0; count <= 5; count++) { printf(int_array[count]); } //zählt bis int_array[5], //obwohl int_array[4] das letzte Element ist //gibt kein Warning, schwer zu entdeckender //Fehler!
Compiler-Fehlermeldungen BEISPIELE Der Compiler sagt - Was kann das bloß bedeuten?
Links C-Referenz: www.cplusplus.com
Zahlenrepräsentation Zahlensysteme Binär (Basis 2) Octal (Basis 8) (in C z.b. 0123) Dezimal (Basis 10) (in C z.b. 123) Hexadezimal (Basis 16) (in C z.b. 0x123) Hexadezimal 0 9 + Ziffer Wert A 10 B 11 C 12 D 13 E 14 F 15
Zahlenrepräsentation 195948557: Dezimal Hex Durch Zielbasis dividieren, Rest von rechts nach links anschreiben Rest 195948557 / 16 D (13) 12 246 784 / 16 0 765 424 / 16 0 47 839 / 16 F (15) 2 989 / 16 D (13) 186 / 16 A (10) 11 / 16 B (11)
Zahlenrepräsentation 0xBEEF: Hex Dezimal Von rechts nach links: Wert x 16 mit Stelle potenzieren 0xB 0xE 0xE 0xF SUMME 11*16³ 14*16² 14*16¹ 15*16⁰ 48879
Zahlenrepräsentation 101010b: Binär Dezimal Von rechts nach links: Wert x 2 mit Stelle potenzieren 0*2 ⁰ + 1*2¹ + 0*2² +1*2³ + 0*2 ⁴ + 1*2 ⁵ = 42 1100101011111110b: Binär Hex Eine Ziffer Hex entspricht 4 Ziffern Binär In 4er Gruppen zusammenfassen und über Dezimal umrechnen Binär 1100 1010 1111 1110 Dezimal 12 10 15 14 Hex C A F E
Zahlenrepräsentation 0xC0CA: Hex Binär Ziffer für Ziffer direkt übersetzen oder Über Dezimal umrechnen (Dezimal->Binär wie Dezimal->Hex, nur mit Basis 2) Hex C 0 C A Dezimal 12 0 12 10 Binär 1100 0000 1100 1010
Bit-Operationen ~ bitweises NOT bitweises OR & bitweises AND ^ bitweises XOR
Bit-Operationen Einzelne Bits auslesen: 01001011 Information AND 00001000 Bitmaske (1 Bit gesetzt) ------------- = 00001000 Ergebnis (TRUE, also gesetzt) 01000011 Information AND 00001000 Bitmaske (1 Bit gesetzt) ------------- = 00000000 Ergebnis (FALSE, also ungesetzt)
Bit-Operationen Einzelnes Bits setzen: 01000011 Information OR 00001000 Bitmaske ------------- = 01001011 Ergebnis (TRUE, also gesetzt) Einzelnes Bits löschen: NOT 00001000 Bitmaske ------------- = 11110111 invertierte Bitmaske 01001011 Information AND 11110111 invertierte Bitmaske ------------- = 01000011 Ergebnis
Bit-Operationen Bits toggeln (umschalten): 01000111 Information XOR 00001100 Bitmaske ------------- = 01001011 Ergebnis Bitmasken zusammenfassen 00000100 Bitmaske I OR 00001000 Bitmaske II ------------- = 00001100 Ergebnis
Bit-Operationen Bit-Shifts 00000100 Wert (4) << (left) ------------- 00001000 Ergebnis (4 * 2 = 8) 00000100 Wert (4) >> (right) ------------- 00000010 Ergebnis (4 / 2 = 2) => Achtung, Beim verschieben der Bits über die Grenzen des Datentypes gehen diese Informationen verloren