Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Hochschule Fulda – FB AI Sommersemester 2014

Ähnliche Präsentationen


Präsentation zum Thema: "Hochschule Fulda – FB AI Sommersemester 2014 "—  Präsentation transkript:

1 Programmieren in C Signale, Bitfelder, Unionen Fehler, Debugging, Profiling
Hochschule Fulda – FB AI Sommersemester 2014 Peter Klingebiel, HS Fulda, DVZ

2 Signale 1 Signal  Systemnachricht an einen Prozess
vergleichbar mit einem Interrupt ausgelöst z.B. vom Nutzer ... Abbruch (Ctrl-C, SIGINT) Programmstop (SIGKILL) ... oder vom System Timer (SIGALRM) Programmende (SIGTERM) #include <signal.h> Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

3 Signale 2 einige Signale:
SIGINT – Unterbrechung (meist Ctrl-C) SIGHUP – Programmende SIGKILL – Programm beenden SIGALRM – Timer abgelaufen Signale können abgefangen werden: void handler(int sig) { ... } ... signal(SIGALRM, handler); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

4 Signale 3 signal.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

5 Signale 4 Timerfunktionen alarm(int nsec)
löst nach nsec Sekunden ein Signal SIGALRM aus: void alrmhandler() { printf("SIGALRM!\n"); } ... signal(SIGALRM, alrmhandler); alarm(5); ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

6 Signale 5 alarm.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

7 Signale 6 Feinere Auflösung mit Intervall-Timer
#include <sys/time.h> Datentypen struct timeval { time_t tv_sec; /* Sekunden */ suseconds_t tv_usec; /* Microsek. */ }; struct itimerval { struct timeval it_interval; struct timeval it_value; }; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

8 Signale 7 Funktionen setitimer(int w, struct itimerval *v, struct itimerval *ov) getitimer(int w, struct itimerval *v) Werte für w ITIMER_REAL Systemuhr/-zeit ITIMER_VIRTUAL Prozesszeit Beispiel: struct itimerval it; it.it_value.tv_sec = 2; /* 2 Sek. */ it.it_value.tv_usec = 0; /* Start */ it.it_interval.tv_sec = 0; /* 0,5 Sek */ it.it_interval.tv_usec = ; /* Interv. */ setitimer(ITIMER_REAL, &it, NULL); Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

9 Bitfelder 1 Bitfelder  Elemente vom struct-Typ
Einzelelemente: int oder unsigned int gedacht für hardwarenahe Programmierung Problem: compilerabhängig  nicht portabel! Beispiel: typedef struct _iodev { /* Bitfeld */ unsigned int rflag:1; /* 1 Bit: Writeflag */ unsigned int wflag:1; /* 1 Bit: Readflag */ unsigned int d1:2; /* Dummy */ unsigned int type:2; /* 2 Bit: Geraetetyp */ unsigned int d2:2; /* Dummy */ unsigned int data:8; /* 8 Bit: Datenbyte */ } iodev; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

10 Bitfelder 2 Speicherung eines Bitfelds
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

11 Bitfelder 3 bitfeld.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

12 Unionen 1 union: spezielle Art von struct
anderer Name: varianter Rekord Speichern der Elemente in union nicht nacheinander, sondern übereinander union-Elemente teilen sich Speicherplatz sinnvoll bei gleichartigen Objekten, die aber verschiedenen Typs sein können union { /* Union: */ char c; /* char */ short s; /* short */ int i; /* int */ } u; /* teilen sich Platz */ Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

13 Unionen 2 Speicherung von struct und union
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

14 Unionen 3 union.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

15 Unionen 4 union oft Element in einem struct
Typ des Elements in union muss definiert sein  eigenes Typelement im struct Beispiel struct number { /* Struct Zahl */ byte typ; /* Typ union-Element */ union { /* Union: */ byte b; /* byte */ short s; /* short */ int i; /* int */ } u; }; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

16 Unionen 5 Zugriff auf union: struct number n; ... switch(n.typ) { case BYTE: dobyte(n.u.b); break; case SHORT: doshort(n.u.s); break; case INT: doint(n.u.i); break; } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

17 Unionen 6 Beispiel: mydraw4.c #define LINE 0x01 /* Typ Linie */ #define RECT 0x /* Typ Rechteck */ #define CIRCLE 0x /* Typ Kreis */ typedef struct _obj { /* Objekt allgemein */ int n; /* Objektnummer */ int f; /* Loeschflag */ int t; /* Typ des Objekts */ union { line l; /* Linie */ rect r; /* Rechteck */ circle c; /* Kreis */ } o; } object; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

18 Unionen 7 mydraw4.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

19 Syntaxfehler 1 C hat kein sinnvolles error recovery
 eine sehr schlechte Fehlerbehandlung beim Übersetzen nach Auftreten von Syntaxfehlern der C-Compiler setzt nach einem Fehler nicht neu auf und tut so, als ob es keinen Fehler gegeben hat, sondern produziert eine Anzahl, manchmal eine wahre Fülle von Folgefehlern  tatsächliche Fehler oft schwer zu finden  Fehlererkennung und –korrektur mühsam Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

20 Syntaxfehler 2 treten nur ein oder ganz wenige Fehler auf  Fehlersuche in oder vor der Zeile, die in der Fehlermeldung angegeben ist treten viele und oft unsinnig erscheinende Fehler auf  Fehlersuche im Umfeld vor der Zeile, die in der Fehlermeldung angegeben ist  dann erneut kompilieren ... oder viel Glück!! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

21 Laufzeitfehler 1 oft ist es mühsam, Syntaxfehler zu finden
noch mühsamer  Laufzeitfehler finden intuitives Herangehen: zusätzliche Ausgaben in den Programmtext einstreuen ggfs. mit CPP-Direktiven #ifdef DEBUG printf("copy: %p %p\n", s1, s2); #endif übersetzen dann mit gcc –DDEBUG file.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

22 Laufzeitfehler 2 debug1.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

23 Laufzeitfehler 3 debug2.c - debug1.c mit CPP-Direktiven
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

24 Laufzeitfehler 4 das Verfahren ist mühsam und zeitaufwendig
Alternative  Debugger nutzen Debugger: Werkzeug, unter dessen Kontrolle ein Programm gestartet und während des Programmslaufs untersucht werden kann für gcc (und CodeBlocks)  Debugger gdb Kode muss für Debugging instrumentiert werden: gcc –g file.c –o file dann Debugger aufrufen: gdb file Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

25 Laufzeitfehler 5 gdb – interaktive Shell mit vielen schönen Features
innerhalb CodeBlocks weitgehend durch die grafische Oberfläche angesteuert wichtige Kommandos help help topic run wenn das Programm läuft, alles ok! bei Fehlern ??? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

26 Laufzeitfehler 6 Wichtige Mechanismen
Breakpoints – Unterbrechung an definierten Stellen (z.B. Zeilennummer, Funktion) break file.c:12 break func Watchpoints – Unterbrechung bei Änderung des Werts einer Variablen watch varname Anzeigen von Variablenwerten print varname Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

27 Laufzeitfehler 7 Breakpoint setzen und starten
break func run Unterbrechung bei Breakpoint print varname continue schrittweises Vorgehen step Debugger beenden quit Programmieren in C - Peter Klingebiel - HS Fulda - DVZ

28 Profilanalyse oft notwendig: Laufzeitverhalten von Programmen zu überprüfen wo wird die Laufzeit verbraucht? wo ist Optimierung notwendig / möglich?  Profilanalyse des Programms Instrumentierung mit -pg bei Neucompilieren gcc -pg prog.c -o prog Starten des Programms  gmon.out prog Profilanalyse mit gprof, prog, gmon.out gprof prog Programmieren in C - Peter Klingebiel - HS Fulda - DVZ


Herunterladen ppt "Hochschule Fulda – FB AI Sommersemester 2014 "

Ähnliche Präsentationen


Google-Anzeigen