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 />

Varianten/Unions<br />

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

Varianten/Unions<br />

Beispiel – Varianten von Personen/1<br />

Beispiel – Varianten von Personen/2<br />

Zwei Personentypen<br />

• Studierende, STUD<br />

• Professoren, PROF<br />

Abbildung mit struct und union<br />

• E<strong>in</strong> struct mit Klassifikator was das<br />

für e<strong>in</strong>e Variante ist<br />

• union aus structs mit den Varianten<br />

1 enum typ { STUD, PROF };<br />

2<br />

3 struct person {<br />

4 enum typ was;<br />

5 union {<br />

6 struct {<br />

7 <strong>in</strong>t matnr;<br />

8 double notenschnitt;<br />

9 <strong>in</strong>t semester;<br />

10 } studi;<br />

11 struct {<br />

12 <strong>in</strong>t persnr;<br />

13 <strong>in</strong>t seitjahr;<br />

14 } prof;<br />

15 } details;<br />

16 };<br />

Erstellung von zwei Personen<br />

• E<strong>in</strong>e Studierende Susi<br />

• E<strong>in</strong> Professor Roland<br />

Ausgabe, nächste Seite<br />

1 struct person susi;<br />

2 struct person roland;<br />

3<br />

4 susi.was = STUD;<br />

5 susi.details.studi.matnr = 123456;<br />

6 susi.details.studi.notenschnitt = 1.6;<br />

7 susi.details.studi.semester = 3;<br />

8<br />

9 roland.was = PROF;<br />

10 roland.details.prof.persnr = 654321;<br />

11 roland.details.prof.seitjahr = 1418;<br />

12<br />

13<br />

14 show(&susi);<br />

15 show(&roland);<br />

123456 1.6 3<br />

654321 1418<br />

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

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

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

Varianten/Unions<br />

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

Bitfelder<br />

Beispiel – Varianten von Personen/3<br />

Bitfelder<br />

Ausgabe von Personen<br />

• Je nach Variante unterschiedlich<br />

1 void show(struct person *p) {<br />

2 switch (p->was) {<br />

3 case STUD:<br />

4 pr<strong>in</strong>tf("%6d %4.2g %1d\n",<br />

5 p->details.studi.matnr,<br />

6 p->details.studi.notenschnitt,<br />

7 p->details.studi.semester);<br />

8 break;<br />

9 case PROF:<br />

10 pr<strong>in</strong>tf("%6d %4d\n",<br />

11 p->details.prof.persnr,<br />

12 p->details.prof.seitjahr);<br />

13 break;<br />

14 }<br />

15 }<br />

123456 1.6 3<br />

654321 1418<br />

1 struct punkt {<br />

Ziel – Wenig Speicherplatz<br />

2 /* XY-Position: 0-1024 */<br />

• Mehrere Zahlen mit kle<strong>in</strong>em<br />

3 unsigned x:10;<br />

Zahlenbereich kompakt repräsentieren 4 unsigned y:10;<br />

Umsetzung – Bitfelder<br />

• Syntax wie struct<br />

• Komponenten<br />

unsigned : <br />

• Es werden Anzahl für Zahl<br />

reserviert<br />

• statt unsigned auch signed möglich<br />

Zugriff<br />

• Punkt-Notation<br />

• Compiler übernimmt Bit-Shifterei<br />

• Achtung: Aktuelles Speicherlayout<br />

implementierungsabhängig<br />

5 /* RGB-Anteile: 0-255 */<br />

6 unsigned r:8;<br />

7 unsigned g:8;<br />

8 unsigned b:8;<br />

9 };<br />

x y r g b<br />

6-8 Byte je Punkt<br />

statt 20 (<strong>in</strong>t) oder 10-12, 16 (short)<br />

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

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

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!