24.02.2014 Aufrufe

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

4 in 1 - Medieninformatik - Hochschule RheinMain

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Programmieren <strong>in</strong> C<br />

Funktionsparameter<br />

Programmieren <strong>in</strong> C<br />

Strukturen<br />

Funktionsparameter<br />

Strukturen – struct<br />

Grundtypen<br />

• In Java Werte<br />

Änderbare Parameter durch<br />

Verpacken <strong>in</strong> Objekte<br />

• In C Werte<br />

Änderbare Parameter durch<br />

Adressoperator (“call by reference”)<br />

• Idiom für z.B. scanf<br />

Felder<br />

• In Java als Referenz übergeben<br />

Werte <strong>in</strong> Feld ändern möglich<br />

Zuweisung heißt Referenz kopieren<br />

• In C Parameter als Zeiger übergeben<br />

Werte <strong>in</strong> Feld können geändert<br />

werden<br />

Zuweisung an Feld nicht möglich<br />

1 void f1(<strong>in</strong>t *pi) { *pi = 17; }<br />

2 void g1(<strong>in</strong>t a[]) {<br />

3 <strong>in</strong>t c[3] = {1,2,3};<br />

4 a = c; /* erlaubt */ }<br />

5 void g2(<strong>in</strong>t *a) {<br />

6 <strong>in</strong>t c[3] = {1,2,3}; a = c; }<br />

7 void g3(<strong>in</strong>t *a) { a[0] = 17; }<br />

1 <strong>in</strong>t i=2;<br />

2 <strong>in</strong>t a[3] = {2,3,5};<br />

3 <strong>in</strong>t b[3] = {2,3,5};<br />

4 /* b = a; nicht erlaubt */<br />

5 f1(&i);<br />

6 /* i == 17 */<br />

7 g3(a);<br />

8 /* a[0] == 17 */<br />

9 scanf("%d", &i);<br />

10 /* i == */<br />

Wie Java-Klasse ohne Methoden<br />

• Alle Komponenten public<br />

Def<strong>in</strong>ition mit struct<br />

• Variablendef<strong>in</strong>ition bei<br />

struct-Deklaration möglich<br />

• Spätere Variablendef<strong>in</strong>ition möglich,<br />

immer mit Schlüsselwort struct<br />

• Initialisierung <strong>in</strong> Reihenfolge der<br />

Deklaration möglich<br />

• Größe implementierungsabhängig<br />

Zugriff auf Komponenten mit .-Operator<br />

Zuweisung ist Kopie<br />

44<br />

• NICHT wie <strong>in</strong> Java<br />

1234 Susi S<strong>in</strong>nlos<br />

4711 Willi Wahns<strong>in</strong>n<br />

1 struct person {<br />

2 char name[40];<br />

3 unsigned <strong>in</strong>t id;<br />

4 } susi;<br />

5<br />

6 struct person rudi;<br />

7 struct person willi = {<br />

8 "Willi Wahns<strong>in</strong>n",<br />

9 4711<br />

10 };<br />

1 strcpy (susi.name, "Susi S<strong>in</strong>nlos");<br />

2 susi.id = 1234;<br />

3 rudi = willi;<br />

4 willi.id = 123456;<br />

5 willi.name[0] = ’X’;<br />

6 pr<strong>in</strong>tf("%6d %s\n", susi.id, susi.name);<br />

7 pr<strong>in</strong>tf("%6d %s\n", rudi.id, rudi.name);<br />

8 pr<strong>in</strong>tf("%ld\n", sizeof (struct person));<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 85 / 326<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 86 / 326<br />

Programmieren <strong>in</strong> C<br />

Strukturen<br />

Programmieren <strong>in</strong> C<br />

Strukturen<br />

Strukturen – Speicherlayout<br />

Speicherlayout<br />

• Compiler entscheidet<br />

• Ke<strong>in</strong>e Annahmen treffen<br />

Beispiel<br />

• F<strong>in</strong>det heraus wo was liegt<br />

• Code nicht gut/portabel<br />

0<br />

4<br />

8<br />

12<br />

16<br />

a 0x44ac2d20<br />

b<br />

c d<br />

d<br />

e<br />

Füll-Bytes<br />

1 struct p1 {<br />

2 short a;<br />

3 <strong>in</strong>t b;<br />

4 char c[3];<br />

5 char d[4];<br />

6 <strong>in</strong>t e;<br />

7 };<br />

1 struct p1 p;<br />

2 char *base = (char *) &p;<br />

3 pr<strong>in</strong>tf("== p:%p ==\n", base);<br />

4 pr<strong>in</strong>tf("a:%2ld b:%2ld c:%2ld d:%2ld e:%2ld\n",<br />

lp a b c<br />

5 ((char *) &p.a)-base, ((char *) &p.b)-base,<br />

0x.. 2 0x.. 1 0x.. 0 0x..<br />

6 ((char *) &p.c)-base, ((char *) &p.d)-base,<br />

7 ((char *) &p.e)-base);<br />

== p:0x44ac2d20 ==<br />

a: 0 b: 4 c: 8 d:11 e:16<br />

Strukturen und Zeiger<br />

Zugriff mit -><br />

• pp->id ist Kurzform für (*pp).id<br />

• Erlaubt e<strong>in</strong>fachen Zugriff auf<br />

Komponenten e<strong>in</strong>er Struktur<br />

• Beispiel: 987654 Rudi Ratlos<br />

Bequem bei Zeigerketten<br />

• Beispiel: 0<br />

1 void change(struct person *pp) {<br />

2 strcpy(pp->name, "Rudi Ratlos");<br />

3 pp->id = 987654;<br />

4 }<br />

1 struct person *pp = &rudi;<br />

2 change(pp);<br />

3 pr<strong>in</strong>tf("%6d %s\n", pp->id, pp->name);<br />

1 struct node {<br />

2 <strong>in</strong>t data;<br />

3 struct node *next;<br />

4 };<br />

1 struct node c = {0, NULL};<br />

2 struct node b = {1, &c};<br />

3 struct node a = {2, &b};<br />

4 struct node *lp = &a;<br />

5 pr<strong>in</strong>tf("%d\n", lp->next->next->data);<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 87 / 326<br />

Prof. Dr. Peter Barth (HS-Rhe<strong>in</strong>Ma<strong>in</strong>) Programmieren 3 29. Januar 2013 88 / 326

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!