460 likes | 584 Views
Informatik II Grundlagen 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. Module 1.
E N D
Informatik IIGrundlagen der ProgrammierungProgrammieren in CModule und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 http://www.rz.hs-fulda.de/et Peter Klingebiel, HS Fulda, DVZ
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
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
Module 3 • Projekt: Module und Bibliotheken Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
Module 5 • Beispiel: Zinsberechnung zinsen2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Module 6 • Beispiel: Moduldatei zpower.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Module 7 • Beispiel: Moduldatei zzins.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Module 8 • Beispiel: Headerdatei zinsen.h Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Module 9 • Beispiel: Hauptprogramm zinsen4.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
Module 12 • Beispiel: Makefile für Zinsprogramme Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
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
Bibliotheken 4 • Beispiel: stdio.h (Fragment) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
Bsp: älteres UNIXtypedef struct {int _cnt;unsigned char *_ptr; unsigned char *_base;unsigned char _flag;unsigned char _file;} FILE;extern FILE _iob[]; Bsp: devcpptypedef struct _iobuf{char *_ptr; int _cnt; char *_base; int _flag; int _file;int _charbuf; int _bufsiz; char *_tmpfname;} FILE;extern FILE *_imp___iob)[]; Bibliotheken 6 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
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
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
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
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
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
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
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
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
Dateien 10 • Beispiel: filecopy.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 11 • Beispiel: numcat.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 12 • Beispiel: revcat.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
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
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
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
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
Dateien 19 • Bsp: Schichten im Betriebsystem Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
Dateien 22 • Diskussion • Warum Pufferung von IO? • Warum Schichtung Anwendungs-/Systemebene? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 23 • Beispiel: bytecopy1.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 24 • Beispiel: bytecopy2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 25 • Beispiel: bytecopy3.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Dateien 26 • Diskussion • Welches bytecopy ist schneller und effizienter? • Warum? Programmieren in C - Peter Klingebiel - HS Fulda - DVZ