2 Kurzeinführung in die Progrmmiersprche C 2.7 Progrmmstruktur & Module 10 Werteustusch zwischen Funktionen Mechnismus Aufrufer Funktion Funktion Aufrufer Prmeter j mit Hilfe von Zeigern Funktionswert nein j glole Vrilen j j Verwendung gloler Vrilen? Vrilen, die von mehreren Funktionen verwendet werden und/oder oft ls Prmeter üergeen werden müssten Menge der Funktionen muss üerschur leien Zugriff uf Modul egrenzen (glole sttic-vrilen) sonst sehr schlechter Progrmmierstil Vrilen, die keiner Funktion ls Vrile oder Prmeter fest zugeordnet werden können grundsätzlich frgwürdig evtl. ein Design-Fehler? sonst Modul suchen, dem die Vrile zugeordnet werden knn Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-41 2 Kurzeinführung in die Progrmmiersprche C 2.7 Progrmmstruktur & Module 11 Getrennte Üersetzung von Progrmmteilen Beispiel Huptprogrmm (Dtei fplot.c ) #include "trig.h" #define INTERVALL 0.01 /* * Funktionswerte usgeen */ int min(void) chr c; doule i; printf("funktion (Sin, Cos, Tn, Cot)? "); scnf("%x", &c); switch (c) cse T : for (i=-pi/2; i < PI/2; i+=intervall) printf("%lf %lf\n", i, tn(i)); rek;; return(0); Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-42
2 Kurzeinführung in die Progrmmiersprche C 2.7 Progrmmstruktur & Module 11 Getrennte Üersetzung Beispiel (2) Heder-Dtei (Dtei trig.h ) #include <stdio.h> #define PI 3.1415926535897932 doule tn(doule), cot(doule); doule cos(doule), sin(doule); Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-43 2 Kurzeinführung in die Progrmmiersprche C 2.7 Progrmmstruktur & Module 11 Getrennte Üersetzung Beispiel (3) Trigonometrische Funktionen (Dtei trigfunc.c ) #include "trig.h" doule tn(doule x) return(sin(x)/cos(x)); doule cot(doule x) return(cos(x)/sin(x)); doule cos(doule x) return(sin(pi/2-x)); Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-44
2 Kurzeinführung in die Progrmmiersprche C 2.7 Progrmmstruktur & Module 11 Getrennte Üersetzung Beispiel (4) Trigonometrische Funktionen Fortsetzung (Dtei trigfunc.c ) doule sin (doule x) doule summe; doule x_qudrt; doule rest; int k; k = 0; summe = 0.0; rest = x; x_qudrt = x*x; while ( fs(rest) > 1e-9 ) summe += rest; k += 2; rest *= -x_qudrt/(k*(k+1)); return(summe); Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-45 8Zeiger(-Vrilen) 2. 2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 1 Einordnung Konstnte: Bezeichnung für einen Wert 0110 0001 Vrile: Bezeichnung eines Dtenojekts Zeiger-Vrile (Pointer): Bezeichnung einer Referenz uf ein Dtenojekt chr *p = &; p Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-46
2 Üerlick 2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) ' Eine Zeigervrile (pointer) enthält ls Wert die Adresse einer nderen Vrilen der Zeiger verweist uf die Vrile Üer diese Adresse knn mn indirekt uf die Vrile zugreifen Drus resultiert die große Bedeutung von Zeigern in C Funktionen können ihre Argumente verändern (cll-y-reference) dynmische Speicherverwltung effizientere Progrmme Aer uch Nchteile! Progrmmstruktur wird unüersichtlicher (welche Funktion knn uf welche Vrile zugreifen?) häufigste Fehlerquelle ei C-Progrmmen Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-47 2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 3 Definition von Zeigervrilen Syntx: Typ *Nme ; Beispiele int x = 5; x 5 int *ip; ip ➊ ➋ int y; ip = &x; ➊ y 5 y = *ip; ➋ Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-48
2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 4 Adressopertoren Adressopertor &. &x Verweisopertor *. der unäre Adress-Opertor liefert eine Referenz uf den Inhlt der Vrilen (des Ojekts) x *x der unäre Verweisopertor * ermöglicht den Zugriff uf den Inhlt der Vrilen (des Ojekts), uf die der Zeiger x verweist Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-49 2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 5 Zeiger ls Funktionsrgumente ' Prmeter werden in C y-vlue üergeen die ufgerufene Funktion knn den ktuellen Prmeter eim Aufrufer nicht verändern uch Zeiger werden y-vlue üergeen, d. h. die Funktion erhält lediglich eine Kopie des Adressverweises üer diesen Verweis knn die Funktion jedoch mit Hilfe des *-Opertors uf die zugehörige Vrile zugreifen und sie verändern cll-y-reference Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-50
2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, ; swp(&, &); void swp (int *, int *) int ; = *; * = *; * = ; Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-51 2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, ; swp(&, &); ➊ ➊ void swp (int *, int *) int ; = *; * = *; * = ; Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-52
2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, ; swp(&, &); void swp (int *, int *) int ; = *; * = *; * = ; Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-53 2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, ; swp(&, &); void swp (int *, int *) int ; = *; ➋ * = *; * = ; * ➋ Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-54
2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, ; swp(&, &); void swp (int *, int *) int ; = *; * = *; ➌ * = ; * * ➌ Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-55 2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, ; swp(&, &); void swp (int *, int *) int ; = *; * = *; * = ; ➍ * ➍ Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-56
2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 5 Zeiger ls Funktionsrgumente (2) void swp (int *, int *); int min() int, ; swp(&, &); ➊ void swp (int *, int *) int ; = *; ➋ * = *; ➌ * = ; ➍ ➊ ➌ ➍ ➋ Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-57 2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 6 Zeiger uf Strukturen Konzept nlog zu "Zeiger uf Vrilen" Adresse einer Struktur mit &-Opertor zu estimmen Zeigerrithmetik erücksichtigt Strukturgröße Beispiele struct student stud1; struct student *pstud; pstud = &stud1; /* pstud stud1 */ Besondere Bedeutung zum Aufu verketteter Strukturen Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-58
2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 6 Zeiger uf Strukturen (2) Zugriff uf Strukturkomponenten üer einen Zeiger Beknnte Vorgehensweise *-Opertor liefert die Struktur.-Opertor zum Zugriff uf Komponente Opertorenvorrng echten (*pstud).est = n ; (*pstud).est = n ; unleserlich! Syntktische Verschönerung ->-Opertor (*pstud).est pstud->est = = n ; n ; Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-59 2 Kurzeinführung in die Progrmmiersprche C 2.8 Zeiger(-Vrilen) 7 Zusmmenfssung Vrile int ; 5 Zeiger int ; *p = &; 5 p Struktur struct int ; sint ; chr c;; struct s s1 = 2, ; s1 2 Zeiger uf Struktur int struct ; s *sp = &s1; s1 2 sp Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-60
9Felder 2. 2 Kurzeinführung in die Progrmmiersprche C 2.9 Felder 1 Eindimensionle Felder eine Reihe von Dten desselen Typs knn zu einem Feld zusmmengefsst werden ei der Definition wird die Größe des Felds ngegeen Größe muss eine Konstnte sein C99 ei loklen Feldern uch zur Lufzeit erechnete Werte zulässig der Zugriff uf die Elemente erfolgt durch Indizierung, eginnend ei Null Definition eines Feldes Typ Nme [ Größe ] Initilisierung ; Beispiele: int x[5]; doule f[20]; Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-61 2 Kurzeinführung in die Progrmmiersprche C 2.9 Felder 2 Initilisierung eines Feldes, = konstnter Ausdruck Ein Feld knn durch eine Liste von konstnten Ausdrücken, die durch Komm getrennt sind, initilisiert werden int prim[4] = 2, 3, 5, 7; chr nme[5] = O, t, t, o, \0 ; wird die explizite Felddimensionierung weggelssen, so estimmt die Zhl der Initilisierungskonstnten die Feldgröße int prim[] = 2, 3, 5, 7; chr nme[] = O, t, t, o, \0 ; werden zu wenig Initilisierungskonstnten ngegeen, so werden die restlichen Elemente mit 0 initilisiert Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-62
2 Kurzeinführung in die Progrmmiersprche C 2.9 Felder 3 Initilisierung eines Feldes (2) Felder des Typs chr können uch durch String-Konstnten initilisiert werden chr nme1[5] = "Otto"; chr nme2[] = "Otto"; Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-63 2 Kurzeinführung in die Progrmmiersprche C 2.9 Felder 4 Zugriffe uf Feldelemente Indizierung: Feldnme [ Ausdruck ] woei: 0 <= Wert(Ausdruck) < Feldgröße Beispiele: prim[0] == 2 prim[1] == 3 nme[1] == t nme[4] == \0 Jürgen Kleinöder Universität Erlngen-Nürnerg Informtik 4, 2010 SS 2010 Systemprogrmmierung (02-Einf-jk.fm 2010-04-22 13.53) A 2-64