informatik ii grundlagen der programmierung programmieren in c module und bibliotheken 1 hochschule...
TRANSCRIPT
Informatik IIGrundlagen der Programmierung
Programmieren in C
Module und Bibliotheken 1
Hochschule Fulda – FB ET
Sommersemester 2010
http://www.rz.hs-fulda.de/et
Peter Klingebiel, HS Fulda, DVZ
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Module 1
• Um größere Programmprojekte überschaubar und sicherer zu machen, wird die Aufgabe in kleinere Teilaufgaben (= Module) zerlegt Reduktion der Komplexität separates Entwickeln und Testen Wiederverwendbarkeit von Programmteilen Erstellen von Programmbibliotheken
• Abstraktion von Daten und Funktionen• Kapselung von Daten
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Module 2
Black Box • Ein Modul in C ist eine Quelldatei, in der eine
oder mehrere Funktionen zusammengefasst werden
• Interne Funktionen möglich, die nur innerhalb des Moduls sichtbar sind
• Interne Variable möglich, die nur innerhalb des Moduls zugreifbar sind
Definition als static
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Module 3
• Projekt: Module und Bibliotheken
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
Module 4
• Schnittstellen eines Moduls, Funktionen und ggfs. Variablen in Headerdatei beschrieben
• Getrennte Übersetzung der Quelldateien und Erzeugen von Objektkode
• Erstellen von Programmbibliotheken zur leichten Wiederverwendbarkeit
• Zusammenmontieren des ausführbaren Programms aus Objektkode der Quellen und der Module sowie aus Bibliotheken
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
Module 5
• Beispiel: Zinsberechnung zinsen2.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7
Module 6
• Beispiel: Moduldatei zpower.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8
Module 7
• Beispiel: Moduldatei zzins.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9
Module 8
• Beispiel: Headerdatei zinsen.h
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Module 9
• Beispiel: Hauptprogramm zinsen4.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
Module 10
• Steuerung der Compilierung bzw. der durchzuführenden Aktionen zur Erzeugung eines Programms oder Objekts durch sog. Makefiles
• Makefiles beschreiben die Abhängigkeit eines Objekts oder Programms von Quelldateien, Modulen und Bibliotheken
• beschreiben die notwendigen Aktionen, um Programme, Objektfiles usw. zu erstellen
• vordefinierte Aktionen, z.B. C Objektfile
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
Module 11
• Aktionen abhängig von Zeitstempeln der Dateien
• Beispiel:prog.exe: main.o modul1.o modul2.o gcc -o prog.exe main.o \ modul1.o modul2.o -lm -lc– Programm prog.exe abhängig von Objektfiles main.o,
modul1.o und modul2.o– Aktion: Binden der Objektfiles mit Libs libm und libc
– Automatisches Neucompilieren einer Quelle und Neubinden des Exe bei Änderung einer Quelldatei
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
Module 12
• Beispiel: Makefile für Zinsprogramme
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
Bibliotheken 1
• in der Programmiersprache C sind nur die notwendigsten Grundfunktionalitäten definiert
• es fehlen z.B. Funktionen für Ein-/Ausgabe, Funktionen für Dateihandling, Funktionen für Stringhandling, höhere mathematische Funktionen und vieles andere mehr
• erleichtert die Entwicklung eines C-Compilers• leichtere Anpassung / Übertragung auf
andere Hardware oder Betriebssysteme
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
Bibliotheken 2
• Sehr viele der in der Sprachdefinition nicht enthaltenen Funktionen werden in sog. Funktionsbibliotheken, wie z.B. der C-Standardbibliothek, mitgeliefert
• In der Standardbibliothek sind u.a. enthalten – Ein- und Ausgabefunktionen, Dateihandling,
Stringfunktionen u.v.m. libc– Mathematische Funktionen libm– und viele, viele weitere Funktionen
• Die C-Standardbibliothek ist „genormt“
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
Bibliotheken 3
• Funktionen sind zu funktionalen Gruppen zusammengefasst jeweils eine eigene Headerdatei
• In den Headerdateien sind Prototypen der Funktionen, Typen, Konstanten, Makros usw. definiert oder deklariert
• Beispiele:– Ein- und Ausgabe stdio.h– Stringfunktionen strings.h– Mathematische Funktionen math.h
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
Bibliotheken 4
• Beispiel: stdio.h (Fragment)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18
Bibliotheken 5
• das Handling von Dateien/Files ist ein sehr gutes Beispiel für Modularisierung in C
• die Definition des Typs FILE ist in stdio.h „verborgen“– benötigt wird für Ein-/Ausgabe in C-Programmen
nur der Typ FILE– die Implementierung des Typs FILE ist für die
Verwendung in Programmen unwichtig– sie sollte auf gar keinen Fall in Programmen
verwendet werden, da sie systemabhängig ist!– alle benötigten Konstanten und EA-Funktionen
sind in stdio.h definiert bzw. deklariert
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
Bibliotheken 6
• Bsp: älteres UNIX
typedef struct {int _cnt;unsigned char *_ptr; unsigned char *_base;unsigned char _flag;unsigned char _file;} FILE;
extern FILE _iob[];
• Bsp: devcpp
typedef struct _iobuf{char *_ptr; int _cnt; char *_base; int _flag; int _file;int _charbuf; int _bufsiz; char *_tmpfname;} FILE;
extern FILE *_imp___iob)[];
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
Bibliotheken 7
• FILE abstrakter Datentyp für Datei-EA• Typ FILE muss (!) unabhängig von der
realen Implementierung genutzt werden, da diese systemabhängig (Betriebssystem, Compiler) ist
• Konstanten teilweise auch systemabhängig• Bsp: devcpp _imp___iob
#define _iob (*_imp___iob)#define stdin (&_iob[STDIN_FILENO])#define stdout (&_iob[STDOUT_FILENO])#define stderr (&_iob[STDERR_FILENO]
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21
Dateien 1
• Grundlegender Datentyp FILE • zugrundeliegendes Modell: stream• Daten- oder Bytestrom: Bytes werden
sequentiell gepuffert gelesen / geschrieben• Bsp: printf("HALLO, WELT");
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22
Dateien 2
• Files Dateien, Pipes, Geräte usw.– Bildschirm / Tastatur stdin, stdout, stderr– Pipes (anonyme Pipes, FIFOs)– Sockets (Netzwerkverbindungen)– Drucker– Tapes, – Festplatte, USB-Stick– usw.
• Effizient für „normale“, sequentielle Files• Uneffizient z.B. für Datenbanken
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
Dateien 3
• FILE *fopen(char *pn, char *mode)• öffnet Datei mit dem Pfadname pn und
verbindet einen stream mit der Datei• liefert einen Zeiger vom Typ FILE * auf den
geöffneten stream• mode gibt den Modus an:
r, rb read - lesen, Datei muss existierenw, wb write - schreiben, Datei wird erzeugt, Dateilänge auf 0 gesetzta, ab append - schreiben, anhängenr+, rb+ update - lesen+schreiben
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
Dateien 4
• fopen() liefert NULL bei Fehler, Bsp: FILE *fp;fp = fopen("datei", "r");if(fp == NULL) { perror("datei"); return(1);}
• void perror(char *msg)– Gibt Systemfehlermeldung auf stderr aus
• int fclose(FILE *fp)– schließt Verbindung zum stream fp
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
Dateien 5
• int fprintf(FILE *fp, char *fmt, /* args */ ...)– formatiertes Schreiben auf stream fp– liefert die Anzahl geschriebener Bytes– printf() fprintf(stdout, ...)
• int fscanf(FILE *fp, char *fmt, /* args */ ...)– formatiertes Lesen von stream fp– liefert Anzahl gelesener Elemente– scanf() fscanf(stdin, ...)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
Dateien 6
• Zeichen-/Wort-Eingabefunktionen• int fgetc(FILE *fp)• int getc(FILE *fp)
– Zeichen von stream fp lesen
– liefert gelesenes Zeichen, EOF bei Dateiende
• getchar() fgetc(stdin)– oft als Makro implementiert
• int fgetw(FILE *fp)– Wort (Integer) von stream fp lesen
– liefert gelesenen Integerwert, EOF bei Dateiende
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
Dateien 7
• String-Eingabefunktionen• char *fgets(char *s, int n, FILE *fp)– Zeile von fp in Puffer s lesen, maximal n Bytes– liefert NULL bei Dateiende
• char *gets(char *s)– Zeile von stdin in Puffer s einlesen– NULL bei EOF– Achtung: Keine Prüfung der Puffergröße– Sicherer fgets() statt gets() verwenden
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
Dateien 8
• Zeichen-/Wort-Ausgabefunktionen• int fputc(int c, FILE *fp)• int putc(int c, FILE *fp)
– Zeichen c auf stream fp ausgeben
– liefert geschriebenes Zeichen, EOF bei Fehler
• putchar(c) fputc(c, stdout)– oft als Makro implementiert
• int putw(int w, FILE *fp)– Wort w (Integer) auf stream fp ausgeben
– liefert geschriebenes Wort, EOF bei Fehler
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
Dateien 9
• String-Ausgabefunktionen• int fputs(char *s, FILE *fp)
– String s auf stream fp ausgeben, EOF bei Fehler
• int puts(char *s)– String s auf stdout ausgeben, EOF bei Fehler
• Ausgabepuffer leeren• int fflush(FILE *fp)
– schreibt Ausgabepuffer des stream fp– liefert 0 bei Erfolg, -1 bei Fehler
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
Dateien 10
• Beispiel: filecopy.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
Dateien 11
• Beispiel: numcat.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32
Dateien 12
• Beispiel: revcat.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33
Dateien 13
• binäre Ein- und Ausgabefunktionen• size_t fread(void *p, size_t s, size_t n, FILE *fp)
• size_t fwrite(void *p, size_t s, size_t n, FILE *fp)
• Lesen/Schreiben von n Objekten der Größe s aus/in den Puffer p von/auf den stream fp
• liefert die Anzahl gelesener/geschriebener Objekte n bzw. -1 bei Fehler
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34
Dateien 14
• Positionierung in Dateien / streams• int fseek(FILE *fp, long o, int w)
– Setzt den Positionszeiger innerhalb des streams fp auf die neue Position w+o
– o (offset) gibt den Offset zu w an– w (whence) gibt die Ausgangsposition an– SEEK_SET Dateianfang + Offset o– SEEK_CUR aktuelle Position + Offset o– SEEK_END Dateiende + Offset o– liefert 0 bei Erfolg, -1 im Fehlerfall
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35
Dateien 15
• long ftell(FILE *fp)– gibt den aktuellen Wert des Positionszeigers
innerhalb der Datei fp aus– liefert aktuelle Position vom Dateianfang an
gesehen, im Fehlerfall -1
• void rewind(FILE *fp)– Positionszeiger der Datei fp auf Dateianfang– rewind(fp) fseek(fp, 0, SEEK_SET)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36
Dateien 16
• Weitere Funktionen• int rename(char *old, char *new)• Umbennenung von Datei old in new • int remove(char *path)• Löschen von Datei path• Funktionen liefern 0 oder bei -1 bei Fehler• int system(char *command)• Ausführen des Strings command• liefert -1 bei Fehler, 0, wenn Kommando ok
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37
Dateien 17
• Fehlerbehandlung• int ferror(FILE *fp)
– liefert Wert != 0 bei Fehler in fp, sonst 0
• int feof(FILE *fp)– liefert Wert != 0 bei EOF in fp, sonst 0
• int clearerr(FILE *fp)– Setzt Fehler- und EOF-Indikator in fp zurück
• void perror(char *s)– gibt Systemfehlermeldung auf stderr aus
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38
Dateien 18
• low-level Systemcalls• alle bisher bekannten Funktionen für Eingabe
und Ausgabe auf streams / Dateien:• arbeiten aus Effizienzgründen gepuffert• nutzen für die tatsächlichen Eingabe- und
Ausgabeoperationen low-level-Funktionen des Betriebssystems
Systemaufrufe oder Systemcalls– teilweise nach Posix genormt
– Unix / Linux ca. 300, Windows Vista geschätzt 360
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39
Dateien 19
• Bsp: Schichten im Betriebsystem
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40
Dateien 20
• Low-level IO-Funktionen• int open(char *path, int flag)• int creat(char *path, mode_t mode)• öffnen / erzeugen Datei mit Namen path• liefern Filedescriptor (Integer), -1 bei Fehler• int close(int fd)• Schliessen der Datei mit Filedescriptor fd • ssize_t read(int fd, void *b, size_t n)• ssize_t write(int fd, void *b, size_t n)• Lesen/Schreiben von n Bytes aus Puffer b auf fd
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41
Dateien 21
• Standardfiledeskriptoren– 0 Standardeingabe stdin– 1 Standardausgabe stdout– 2 Standardfehlerausgabe stderr
• FILE *fdopen(int fd, char *mode)– verbindet einen stream mit einem Filedeskriptor
• int fileno(FILE *fp)– liefert Filedeskriptor zum stream fp– Filedeskriptor ist Teil des FILE-Datentyps– Zugriff durch Funktion fileno() gekapselt
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42
Dateien 22
• Diskussion– Warum Pufferung von IO?– Warum Schichtung Anwendungs-/Systemebene?
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 43
Dateien 23
• Beispiel: bytecopy1.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 44
Dateien 24
• Beispiel: bytecopy2.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 45
Dateien 25
• Beispiel: bytecopy3.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 46
Dateien 26
• Diskussion– Welches bytecopy ist schneller und effizienter? – Warum?