Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule...

46
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

Transcript of Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule...

Page 1: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 2: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 3: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 4: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Module 3

• Projekt: Module und Bibliotheken

Page 5: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 6: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Module 5

• Beispiel: Zinsberechnung zinsen2.c

Page 7: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Module 6

• Beispiel: Moduldatei zpower.c

Page 8: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Module 7

• Beispiel: Moduldatei zzins.c

Page 9: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Module 8

• Beispiel: Headerdatei zinsen.h

Page 10: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Module 9

• Beispiel: Hauptprogramm zinsen4.c

Page 11: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 12: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 13: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Module 12

• Beispiel: Makefile für Zinsprogramme

Page 14: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 15: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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“

Page 16: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 17: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Bibliotheken 4

• Beispiel: stdio.h (Fragment)

Page 18: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 19: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 20: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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]

Page 21: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 22: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 23: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 24: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 25: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 26: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 27: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 28: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 29: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 30: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Dateien 10

• Beispiel: filecopy.c

Page 31: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Dateien 11

• Beispiel: numcat.c

Page 32: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Dateien 12

• Beispiel: revcat.c

Page 33: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 34: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 35: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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)

Page 36: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 37: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 38: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 39: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Dateien 19

• Bsp: Schichten im Betriebsystem

Page 40: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 41: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Page 42: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Dateien 22

• Diskussion– Warum Pufferung von IO?– Warum Schichtung Anwendungs-/Systemebene?

Page 43: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Dateien 23

• Beispiel: bytecopy1.c

Page 44: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Dateien 24

• Beispiel: bytecopy2.c

Page 45: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Dateien 25

• Beispiel: bytecopy3.c

Page 46: Informatik II Grundlagen der Programmierung Programmieren in C Module und Bibliotheken 1 Hochschule Fulda – FB ET Sommersemester 2010 .

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

Dateien 26

• Diskussion– Welches bytecopy ist schneller und effizienter? – Warum?