4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
4 in 1 - Medieninformatik - Hochschule RheinMain
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