Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   

Die mobilen Seiten von c++.de:
http://m.c-plusplus.de
Infos hier [BETA]

  
c++.de :: C (C89, C99 und C11) ::  Bitfelder portabel?  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
gigg
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.03.2012
Beiträge: 175
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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




Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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.
c++.de :: C (C89, C99 und C11) ::  Bitfelder portabel?  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info und www.c-plusplus.net enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.