Programmieren in C Grundlagen C 3 Hochschule Fulda – FB AI Sommersemester 2014 http://c-ai.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ
Felder 1 Ein Feld (array) ist die Zusammenfassung von Daten gleichen Typs in einer Variablen Felder haben eine oder auch mehrere Dimensionen (Vektoren, Matrizen, …) Definition von Feldern: char sbuf[128]; int arr[] = { 1, 8, 7, -1, 2 }; short mat[2][2] = { 11, 12, 21, 22}; Mit der Felddefinition wird der benötigte Speicherplatz für die Variable reserviert Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder 2 Zugriff auf Feldelemente mit Index in []: char c; c = sbuf[32]; sbuf[0] = 'A'; Die Feldindizierung beginnt immer mit 0! short s, mat[3][3]; s = mat[0][0]; Felder werden elementweise und Zeile für Zeile hintereinander abgespeichert Es gibt beim Zugriff keinerlei Überprüfungen auf Bereichsgrenzen von Feldern! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder 3 Feldnamen sind eigentlich Pointer, zeigen auf das erste Element im Feld Felder werden mit Adresse an Funktionen übergeben (wie Pointer) Feldindizes sind eigentlich Offsets und geben den Abstand zum Feldanfang an Bsp: ia[3] *(&ia[0] + 3 * sizeof(int)) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
Felder und Zeiger 2 Beispiel Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder und Zeiger 3 Vor Ablauf Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder und Zeiger 4 Programmstart: Speicher für Feld reservieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder und Zeiger 5 Programmstart: Speicher für Zeiger reservieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder und Zeiger 6 Zeiger bufp Feld buf bzw. &buf[0] Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder und Zeiger 7 Zeichen 'A' buf[0] Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder und Zeiger 8 *bufp 'Y' Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder und Zeiger 9 bufp inkrementieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder und Zeiger 10 *bufp 'Z' Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Felder und Zeiger 11 Danach Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
Zeichenketten 3 Beispiel: String kopieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 4 Programmstart Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 5 Konstante in Speicher Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 6 Pointer s1 initialisieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 7 Speicher für s1 und t anlegen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 8 String s2 = t s2 = & t[0] Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 9 Schleife: zeichenweise kopieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 10 Zeichen kopieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 11 Pointer inkrementieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 12 … Zeichen kopieren Pointer inkrementieren bis Ende des Strings erreicht *s1 == '\0' Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 13 End of String: *s1 == '\0' Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 14 String terminieren: *s2 = '\0' Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenketten 15 Danach Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Exkurs Kommandozeilenparameter 1 Bekannt: jedes C-Programm startet mit einer main-Funktion main-Funktion ist vom Typ int und hat drei Parameter: int argc Anzahl von Kommandozeilenparametern char *argv[] Feld von Strings Kommandozeilenparameter char *envv[] Feld von Strings Umgebungsparameter Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
Exkurs Kommandozeilenparameter 3 Beispiel: echo2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
Aufzählungsdatentyp 2 Beispiel: enumdemo.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
Zusammengesetzte Datentypen 2 Beispiel: Datentyp struct circle für Objekt Kreis in einem Zeichenprogramm notwendig 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
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
Zusammengesetzte Datentypen 4 Beispiel: mydraw1.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
Exkurs Computergrafik 2 Beispiel Pixelgrafik, GIF-Format Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Exkurs Computergrafik 3 Beispiel: Vektorgrafik, SVG-Format Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
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
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
Typdefinitionen 3 Beispiel: mydraw2.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
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
Typdefinitionen 5 Beispiel: mydraw3.c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ