Programmieren in C
Grundlagen C 3
Hochschule Fulda – FB AI
Wintersemester 2013/14
http://c.rz.hs-fulda.de
Peter Klingebiel, HS Fulda, DVZ
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Felder und Zeiger 1
• Felder reservieren bei der Definition den benötigten Speicherplatz
• Zeiger erhalten den Speicherplatz erst bei der Zuweisung des Objekts, auf das sie zeigen, oder bei dynamischer Speicherallokation
• Ähnlichkeit von Feldern und Zeigern mächtige Pointerarithmetik möglich
• Manchmal ein wenig unverständlich!• Pointer essentiell bei Zeichenketten (strings)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Felder und Zeiger 2
• Beispiel
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Felder und Zeiger 3
• Vor Ablauf
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
Felder und Zeiger 4
• Programmstart: Speicher für Feld reservieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
Felder und Zeiger 5
• Programmstart: Speicher für Zeiger reservieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7
Felder und Zeiger 6
• Zeiger bufp Feld buf bzw. &buf[0]
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8
Felder und Zeiger 7
• Zeichen 'A' buf[0]
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9
Felder und Zeiger 8
• *bufp 'Y'
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Felder und Zeiger 9
• bufp inkrementieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
Felder und Zeiger 10
• *bufp 'Z'
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
Felder und Zeiger 11
• Danach
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
Zeichenketten 1
• Zeichenketten (strings) sind eine Folge von Einzelzeichen char
• String ist terminiert mit '\0'• Speicherbedarf: Länge + 1 Byte• Beispiel: char *s; char *hallo = "Hallo, Welt!";
• String Pointer auf Feld von Elementen vom Typ char
• Nullstring NULL (definiert in stdio.h)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
Zeichenketten 2
• Beispiel: char buffer[128]; char *bp = buffer;
• Stringpointer bp erstes Zeichen im Feld buffer
Ähnlichkeit von Feldern und Pointern!• Beispiel: String kopieren und ausgeben
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
Zeichenketten 3
• Beispiel: String kopieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
Zeichenketten 4
• Programmstart
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
Zeichenketten 5
• Konstante in Speicher
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18
Zeichenketten 6
• Pointer s1 initialisieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
Zeichenketten 7
• Speicher für s1 und t anlegen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
Zeichenketten 8
• String s2 = t s2 = & t[0]
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21
Zeichenketten 9
• Schleife: zeichenweise kopieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22
Zeichenketten 10
• Zeichen kopieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
Zeichenketten 11
• Pointer inkrementieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
Zeichenketten 12
• …• Zeichen kopieren• Pointer inkrementieren• bis Ende des Strings erreicht
*s1 == '\0'• …
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
Zeichenketten 13
• End of String: *s1 == '\0'
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
Zeichenketten 14
• String terminieren: *s2 = '\0'
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
Zeichenketten 15
• Danach
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
Exkurs Kommandozeilenparameter 1
• Bekannt: jedes C-Programm startet mit einer main-Funktion
• main-Funktion ist vom Typ int und hat drei Parameter:
• int argcAnzahl von Kommandozeilenparametern
• char *argv[]Feld von Strings Kommandozeilenparameter
• char *envv[]Feld von Strings Umgebungsparameter
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
Exkurs Kommandozeilenparameter 2
• Beispiel echo1.c
/* echo1.c */
#include <stdio.h>
int main(int argc, char **argv){ while(--argc) printf("%s ", *++argv); putchar('\n'); return(0);}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
Exkurs Kommandozeilenparameter 3
• Beispiel: echo2.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
Aufzählungsdatentyp 1
• Aufzählungsdatentyp enum• Für Datentypen mit diskreten konstanten
Werten• Beispiel: enum color { rot, gruen, blau } c; enum boolean { FALSE, TRUE } b; b = FALSE; c = blau;
• Darstellung als int beginnend mit 0,wenn nicht explizit angegeben: enum boolean { TRUE=1, FALSE=0 } b; b = TRUE;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32
Aufzählungsdatentyp 2
• Beispiel: enumdemo.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33
Zusammengesetzte Datentypen 1
• Zusammenfassung von zusammgehörigen Daten in eigenen Datentyp struct
• Beispiel einfaches EA-Gerät mit 8-Bit Steuerregister cr und 16-Bit Datenregister dr: struct { char cr; int dr; } ea1; struct _ea { char cr; int dr; } ea2;
• Zugriff durch Selektor . if(ea1.cr & 0x01) ea2.dr = 4711;
• Bei Pointern durch Selektor -> if(ea1->cr & 0x01) ea2->dr = 4711;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 34
Zusammengesetzte Datentypen 2
• Beispiel: Datentyp struct circle für Objekt Kreis in einem Zeichenprogrammnotwendig Mittelpunkt (x,y) und Radius r
/* Kreis: Typ */struct circle { int x; /* Mittelpunktkoordinate x */ int y; /* Mittelpunktkoordinate y */ int r; /* Radius */};struct circle c;c.x = 100; c.y = 100; c.r = 50;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 35
Zusammengesetzte Datentypen 3
• Funktionen für struct circle
/* Kreis bewegen: Mittelpunkt veraendern */void move_circle(struct circle *c, int x, int y){ c->x = x; c->y = y; }
/* Kreisgroesse aendern: Radius veraendern */ void resize_circle(struct circle *c, int r){ c->r = r;}
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36
Zusammengesetzte Datentypen 4
• Beispiel: mydraw1.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37
Exkurs Computergrafik 1
• Zwei Typen von Computergrafik:• Pixelgrafik
– Grafik wird pixelweise aufgebaut– Formate: gif, jpg, png, bmp, …– Probleme bei Skalierung
• Vektorgrafik– Grafik besteht aus Objekten mit den nötigen
Eigenschaften, z.B. Linie: (x1,y1) und (x2,y2)oder Kreis: Mittelpunkt (x,y) und Radius r
– Problemlos skalierbar
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38
Exkurs Computergrafik 2
• Beispiel Pixelgrafik, GIF-Format
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39
Exkurs Computergrafik 3
• Beispiel: Vektorgrafik, SVG-Format
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40
Exkurs Computergrafik 4
• SVG – Scalable Vector Graphics• Wikipedia
http://de.wikipedia.org/wiki/Scalable_Vector_Graphics
• Veröffentlicht vom W3C erstmals 09/2001• vergleichbar Flash• Animationen und Präsentationen möglich• XML-Format• im Browser eingebaut (Opera, Firefox, u.v.a.,
Internet Explorer ab Version 9!)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41
Typdefinitionen 1
• Oft sinnvoll, eigene Typen oder Untertypen zu definieren typedef
• Beispiel: typedef unsigned char byte;
• Beispiel: typedef struct _ea { byte cr; int dr; } ea; ea ea1, ea2;
• Problem: Typprüfung bei C eher ungenau! besser lesbar, bessere Dokumentation!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42
Typdefinitionen 2
• Erweiterung von mydraw: mydraw2.c
typedef enum { /* Farben */ white, black, grey, red, green, blue, yellow, cyan, magenta} color;
typedef struct _circle { /* Kreis */ int x; /* Mittelpunktkoordinate x */ int y; /* Mittelpunktkoordinate y */ int r; /* Radius */ color c; /* Farbe */} circle;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 43
Typdefinitionen 3
• Beispiel: mydraw2.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 44
Typdefinitionen 4
• Erweiterung Linien, Rechtecke: mydraw3.c
typedef struct _line { /* Linie */ int x1, y1; /* Eckpunkt 1 x,y */ int x2, y2; /* Eckpunkt 2 x,y */ color c; /* Farbe */} line;
typedef struct _rect { /* Rechteck */ int x, y; /* Linke obere Ecke x,y */ int w; /* Breite */ int h; /* Hoehe */ color c; /* Farbe */} rect;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 45
Typdefinitionen 5
• Beispiel: mydraw3.c