Informatik II Programmieren in C - Webserver - DVZ

Download Report

Transcript Informatik II Programmieren in C - Webserver - DVZ

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
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
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
2
Anwendung Smartmeter 2
• Datentypen für Messungen
– wie sollen die Messungen abgebildet werden?
– wie sollen die Messungen gespeichert werden?
???
???
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
3
Anwendung Smartmeter 3
• Wie sieht die Messfunktion aus?
Simulation!
???
???
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
4
Anwendung Smartmeter 4
• Wie sieht die Sendefunktion aus?
Simulation!
???
???
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
5
Anwendung Smartmeter 5
• Wie sieht die main-Funktion aus?
Simulation!
???
???
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
6
Anwendung Smartmeter 6
• smartmeter1.c
/*
*
*
*
*
*
*
*/
smartmeter1.c
Simulation eines Smartmeter mit
1 Messung / Minute, nach 15 Min
Einfache Variante: Feld mit 15
Schleife: Messen - Versenden
klin, 08.06.2010
#include <stdio.h>
#include <time.h>
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
7
Anwendung Smartmeter 7
• smartmeter mit Grafikausgabe (SVG)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
8
Anwendung Smartmeter 8
• smartmeter2.c
/*
*
*
*
*
*/
smartmeter2.c
Simulation eines Smartmeter mit
Wie smartmeter1 mit Grafikausga
klin, 08.06.2010
#include <stdio.h>
#include <time.h>
/* Typ fuer Smartmeter */
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
9
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
10
Signale 2
• einige Signale:
– Unterbrechung (meist Ctrl-C)
– Programmende
– Programm beenden
– Timer abgelaufen
• Signale können abgefangen werden:
void handler(int sig)
{
...
}
...
signal(SIGALRM, handler);
–
–
–
–
SIGINT
SIGHUP
SIGKILL
SIGALRM
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
11
Signale 3
• signal.c
/*
*
*
*
*/
signal.c
Demo fuer Signale
klin, 20.06.2010
#include <stdio.h>
#include <signal.h>
unsigned long dumcnt = 0;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
/* Schl
12
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
13
Signale 5
• alarm.c
/*
*
*
*
*
*
*/
alarm.c
Demo fuer alarm und SIGALRM
klin, 20.06.2010
Unix, Linux, Cygwin, NICHT devAufruf: alarm sekunden
#include <stdio.h>
#include <signal.h>
#include <time.h>
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
14
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
*/
*/
15
Signale 7
• Funktionen
setitimer(int w, struct itimerval *v,
struct itimerval *ov)
getitimer(int w, struct itimerval *v)
• Werte für w
ITIMER_REAL
ITIMER_VIRTUAL
Systemuhr/-zeit
Prozesszeit
• Beispiel:
struct itimerval it;
it.it_value.tv_sec = 2;
/*
it.it_value.tv_usec = 0;
/*
it.it_interval.tv_sec = 0;
/*
it.it_interval.tv_usec = 500000; /*
setitimer(ITIMER_REAL, &it, NULL);
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
2 Sek.
Start
0,5 Sek
Interv.
*/
*/
*/
*/
16
Signale 8
• smartmeter3.c
/*
*
*
*
*
*
*
*/
smartmeter3.c
Simulation eines Smartmeter mit
1 Messung / Minute, nach 15 Min
Variante: Ringpuffer mit Eintra
Kann z.B. mit parallelen Thread
klin, 08.06.2010
#include <stdio.h>
#include <stdlib.h>
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
17
Signale 9
• smartmeter4.c
/*
*
*
*
*
*
*
*
*/
smartmeter4.c
Simulation eines Smartmeter mit
1 Messung / Minute, nach 15 Min
Variante: Ringpuffer mit Eintra
Mit grafischer Ausgabe in SVG
Kann z.B. mit parallelen Thread
klin, 08.06.2010
#include <stdio.h>
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
18
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
unsigned int
unsigned int
unsigned int
unsigned int
unsigned int
unsigned int
} iodev;
_iodev {
rflag:1;
wflag:1;
d1:2;
type:2;
d2:2;
data:8;
/*
/*
/*
/*
/*
/*
/*
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Bitfeld
1 Bit: Writeflag
1 Bit: Readflag
Dummy
2 Bit: Geraetetyp
Dummy
8 Bit: Datenbyte
*/
*/
*/
*/
*/
*/
*/
19
Bitfelder 2
• Speicherung eines Bitfelds
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
20
Bitfelder 3
• bitfeld.c
/*
*
*
*
*
*/
bitfeld.c
Demo Bitfelder
klin, 16.06.2010
Aufruf: bitfeld [-v]
#include <stdio.h>
#define IO_RD 1
#define IO_WD 2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
/* Lesegeraet *
/* Schreibgerae
21
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 {
char c;
short s;
int i;
} u;
/* Union:
/*
char
/*
short
/*
int
/* teilen sich Platz
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
*/
*/
*/
*/
*/
22
Unionen 2
• Speicherung von struct und union
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
23
Unionen 3
• union.c
/*
*
*
*
*/
union.c
Demo union
klin, 16.06.2010
#include <stdio.h>
struct {
char c;
short s;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
/* Struct */
24
Unionen 4
• union oft Element in einem struct
• Typ des Elements in union muss definiert
sein  eigenes Typelement im struct
• Beispiel
struct number {
byte typ;
union {
byte b;
short s;
int i;
} u;
};
/* Struct Zahl
/* Typ union-Element
/* Union:
/*
byte
/*
short
/*
int
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
*/
*/
*/
*/
*/
*/
25
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
26
Unionen 6
• Beispiel: mydraw4.c
#define LINE
#define RECT
#define CIRCLE
...
typedef struct
int n;
int f;
int t;
union {
line l;
rect r;
circle c;
} o;
} object;
0x01
0x02
0x04
/* Typ Linie
/* Typ Rechteck
/* Typ Kreis
*/
*/
*/
_obj {
/*
/*
/*
/*
*/
*/
*/
*/
/*
/*
/*
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Objekt allgemein
Objektnummer
Loeschflag
Typ des Objekts
Linie
Rechteck
Kreis
*/
*/
*/
27
Unionen 7
• mydraw4.c
/*
*
*
*
*
*
*
*
*/
mydraw4.c
Einfaches Zeichenprogramm
Kreise, Linien, Rechtecke, Farb
Leinwandgroesse: 640 x 480 Pixe
Erzeugt SVG-Format
Version 4 - interaktiv
klin, 20.06.2010
#include <stdio.h>
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
28
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
29
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
30
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
31
Laufzeitfehler 2
• debug1.c
/*
*
*
*/
debug1.c
klin, 20.06.2010
#include <stdio.h>
char *string;
void scopy(char *s1, char *s2)
{
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
32
Laufzeitfehler 3
• debug2.c - debug1.c mit CPP-Direktiven
/*
*
*
*/
debug2.c
klin, 20.06.2010
#include <stdio.h>
char *string;
void scopy(char *s1, char *s2)
{
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
33
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
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
34
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 ???
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
35
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
36
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
37
Laufzeitfehler 8
• debug3.c
/*
*
*
*/
debug3.c
klin, 20.06.2010
#include <stdio.h>
double df1[5] = { 1.1, 2.2, 3.3, 4.4, 5
double df2[5];
void fsquare(double *f1, double *f2, in
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
38
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
39