39
Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010 http:// www.rz.hs-fulda.de /et Peter Klingebiel, HS Fulda, DVZ

Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010 Peter

Embed Size (px)

Citation preview

Page 1: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Informatik IIGrundlagen der Programmierung

Programmieren in C

Add Ons

Hochschule Fulda – FB ET

Sommersemester 2010

http://www.rz.hs-fulda.de/et

Peter Klingebiel, HS Fulda, DVZ

Page 2: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2

Anwendung Smartmeter 1

• Entwicklung eines Programms zum Auslesen des "intelligenten Stromzählers"

• 3 Stromkreise sind zu messen• 1 Meßwert / Sekunde• 15 Minuten messen, dann Übertragung der

Meßwerte an Versorger / Drittanbieter

Page 3: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3

Anwendung Smartmeter 2

• Datentypen für Messungen– wie sollen die Messungen abgebildet werden?– wie sollen die Messungen gespeichert werden?

Page 4: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4

Anwendung Smartmeter 3

• Wie sieht die Messfunktion aus? Simulation!

Page 5: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5

Anwendung Smartmeter 4

• Wie sieht die Sendefunktion aus?Simulation!

Page 6: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6

Anwendung Smartmeter 5

• Wie sieht die main-Funktion aus?Simulation!

Page 7: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7

Anwendung Smartmeter 6

• smartmeter1.c

Page 8: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8

Anwendung Smartmeter 7

• smartmeter mit Grafikausgabe (SVG)

Page 9: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9

Anwendung Smartmeter 8

• smartmeter2.c

Page 10: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10

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>

Page 11: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11

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);

Page 12: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12

Signale 3

• signal.c

Page 13: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13

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);...

Page 14: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14

Signale 5

• alarm.c

Page 15: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15

Signale 6

• Feinere Auflösung mit Intervall-Timer• #include <sys/time.h>• Datentypenstruct timeval { time_t tv_sec; /* Sekunden */ suseconds_t tv_usec; /* Microsek. */};struct itimerval { struct timeval it_interval; struct timeval it_value;};

Page 16: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16

Signale 7

• Funktionensetitimer(int w, struct itimerval *v, struct itimerval *ov)getitimer(int w, struct itimerval *v)

• Werte für wITIMER_REAL Systemuhr/-zeitITIMER_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 = 500000; /* Interv. */setitimer(ITIMER_REAL, &it, NULL);

Page 17: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17

Signale 8

• smartmeter3.c

Page 18: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18

Signale 9

• smartmeter4.c

Page 19: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19

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;

Page 20: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20

Bitfelder 2

• Speicherung eines Bitfelds

Page 21: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21

Bitfelder 3

• bitfeld.c

Page 22: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22

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 */

Page 23: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23

Unionen 2

• Speicherung von struct und union

Page 24: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24

Unionen 3

• union.c

Page 25: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25

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; };

Page 26: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26

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;}

Page 27: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27

Unionen 6

• Beispiel: mydraw4.c#define LINE 0x01 /* Typ Linie */#define RECT 0x02 /* Typ Rechteck */ #define CIRCLE 0x04 /* 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;

Page 28: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28

Unionen 7

• mydraw4.c

Page 29: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29

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

Page 30: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30

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!!

Page 31: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31

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 DEBUGprintf("copy: %p %p\n", s1, s2);#endif

• übersetzen dann mitgcc –DDEBUG file.c

Page 32: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32

Laufzeitfehler 2

• debug1.c

Page 33: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33

Laufzeitfehler 3

• debug2.c - debug1.c mit CPP-Direktiven

Page 34: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34

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 dev-cpp) GNU-Debugger gdb• Kode muss für Debugging instrumentiert

werden: gcc –g file.c –o file• dann Debugger aufrufen:gdb file

Page 35: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35

Laufzeitfehler 5

• gdb – interaktive Shell mit vielen schönen Features

• innerhalb dev-cpp weitgehend durch die grafische Oberfläche angesteuert

• wichtige Kommandos– help– help topic– run

• wenn das Programm läuft, alles ok!• bei Fehlern ???

Page 36: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36

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

Page 37: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37

Laufzeitfehler 7

• Breakpoint setzen und starten– break func– run

• Unterbrechung bei Breakpoint– print varname– continue

• schrittweises Vorgehen– step

• Debugger beenden– quit

Page 38: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38

Laufzeitfehler 8

• debug3.c

Page 39: Informatik II Grundlagen der Programmierung Programmieren in C Add Ons Hochschule Fulda – FB ET Sommersemester 2010  Peter

Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39

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.outprog

• Profilanalyse mit gprof, prog, gmon.outgprof prog