| Autor |
Nachricht |
gigg
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.03.2012
Beiträge: 175
|
gigg Mitglied
12:23:09 22.08.2012 Titel: |
Bitfelder portabel? |
Zitieren |
Hallo,
ich sitze gerade an einem grafischen Programm (Gtk2), habe aber eine C-Frage:
Ich moechte den Zustand von 30 Check-Buttons in einer Schleife abfragen und dann in einem Bit-Feld speichern. Jetzt habe ich irgendwo gelesen, dass Bitfelder nicht wirklich portabel sind, da die Bits unterschiedlich interpretiert werden.
Das Programm soll auf verschiedenen Linux- und BSD-Varianten lauffaehig sein. Ist es besser, auf Bit-Felder zu verzichten und eine andere Loesung zu suchen?
(Bitte nicht ins GUI-Forum verschieben - da bekomme ich nie eine Antwort, denke mal, dass kaum einer Gtk mit C benutzt.)
Danke fuer Antworten. |
|
|
|
 |
Bashar
Mitglied
Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17742
|
Bashar Mitglied
12:35:32 22.08.2012 Titel: |
|
Zitieren |
| Zitat: | | Jetzt habe ich irgendwo gelesen, dass Bitfelder nicht wirklich portabel sind, da die Bits unterschiedlich interpretiert werden. |
Argh, Halbwissen aus dritter Hand.
Natürlich sind die portabel, und was soll an Bits großartig interpretiert werden? |
_________________ OSL♥
|
|
 |
gigg
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.03.2012
Beiträge: 175
|
gigg Mitglied
12:43:35 22.08.2012 Titel: |
|
Zitieren |
Zitat aus "C-kurz und gut" von Peter Prinz und Ulla Kirch-Prinz (O'Reilly):
"Es kann zu Problemen bei der Portierung von C-Programmen kommen, da die Interpretation der Bits innerhalb eines Wortes maschinenabhaengig ist." |
|
|
|
 |
Bashar
Mitglied
Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17742
|
Bashar Mitglied
12:57:41 22.08.2012 Titel: |
|
Zitieren |
Leider immer noch Unsinn. Es kann zu Problemen kommen, wenn man Bitfeldstrukturen als Zahlen reinterpretiert (z.B. mit union). Aber das ist ja immer so und hat nicht direkt was mit Bitfeldern zu tun. Wenn du die als einfache Flags benutzt und dich das konkrete Speicherlayout nicht interessiert, hast du keine Probleme.
Nochmal zu deinem Ursprungsposting: Wie stellst du dir das vor, die Bitfelder in einer Schleife anzusprechen? |
_________________ OSL♥
|
|
 |
gigg
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.03.2012
Beiträge: 175
|
gigg Mitglied
13:03:49 22.08.2012 Titel: |
|
Zitieren |
| Bashar schrieb: |
Nochmal zu deinem Ursprungsposting: Wie stellst du dir das vor, die Bitfelder in einer Schleife anzusprechen? |
Gute Frage. Soweit war ich noch gar nicht.
Meine Ueberlegung ging zunaechst in die Richtung, Speicher zu sparen und eben kein Array von 30 Integerwerten zu benutzen. Aber das ist wohl doch die bessere Variante. Danke erstmal fuer deine Antwort. |
Zuletzt bearbeitet von gigg am 13:04:51 22.08.2012, insgesamt 1-mal bearbeitet |
|
 |
DirkB
Unregistrierter
|
DirkB Unregistrierter
13:34:48 22.08.2012 Titel: |
|
Zitieren |
Wenn du Speicher sparen willst, dann nimm char statt int. |
|
|
|
 |
CJosef
Mitglied
Benutzerprofil
Anmeldungsdatum: 09.08.2012
Beiträge: 411
|
CJosef Mitglied
13:38:08 22.08.2012 Titel: |
|
Zitieren |
Den Zustand eines Buttons kannst du direkt über die übergebene Callback-Funktion bekommen... |
|
|
|
 |
gigg
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.03.2012
Beiträge: 175
|
gigg Mitglied
13:54:23 22.08.2012 Titel: |
|
Zitieren |
| CJosef schrieb: | | Den Zustand eines Buttons kannst du direkt über die übergebene Callback-Funktion bekommen... |
Ja, das ist klar. Es geht mir darum, den Zustand von 30 Buttons effizient abzufragen und in einer Datenstruktur abzulegen.
Danke an alle. Ich bin jetzt auf der richtigen Spur. |
|
|
|
 |
Bashar
Mitglied
Benutzerprofil
Anmeldungsdatum: 15.05.2001
Beiträge: 17742
|
Bashar Mitglied
14:00:09 22.08.2012 Titel: |
|
Zitieren |
Du kannst es auch direkt über Bitoperationen machen:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdint.h>
int32_t flags;
// Flag 14 abfragen
if (flags & (1 << 14))
...
// Flag 14 setzen
flags |= 1 << 14;
// Flag 14 löschen
flags &= ~(1 << 14); | |
Das geht dann auch in einer Schleife.
Du solltest aber wie gesagt vermeiden, flags über union oder durch Pointer-Casts mit einer Bitfeldstruktur zu überlagern und die Flags mal über Bitoperationen und mal als Bitfelder anzusprechen. |
_________________ OSL♥
Zuletzt bearbeitet von Bashar am 14:00:37 22.08.2012, insgesamt 1-mal bearbeitet |
|
 |
gigg
Mitglied
Benutzerprofil
Anmeldungsdatum: 12.03.2012
Beiträge: 175
|
gigg Mitglied
14:14:05 22.08.2012 Titel: |
|
Zitieren |
| Bashar schrieb: | Du kannst es auch direkt über Bitoperationen machen:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdint.h>
int32_t flags;
// Flag 14 abfragen
if (flags & (1 << 14))
...
// Flag 14 setzen
flags |= 1 << 14;
// Flag 14 löschen
flags &= ~(1 << 14); | |
Das geht dann auch in einer Schleife.
Du solltest aber wie gesagt vermeiden, flags über union oder durch Pointer-Casts mit einer Bitfeldstruktur zu überlagern und die Flags mal über Bitoperationen und mal als Bitfelder anzusprechen. |
Auf die Art werde ich es probieren. Danke.
In Assembler haette ich das hingekriegt, in C fehlt mir noch Erfahrung. |
|
|
|
 |