Bitfelder portabel?



  • 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.



  • 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?



  • 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."



  • 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?



  • 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.



  • Wenn du Speicher sparen willst, dann nimm char statt int.



  • Den Zustand eines Buttons kannst du direkt über die übergebene Callback-Funktion bekommen...



  • 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.



  • Du kannst es auch direkt über Bitoperationen machen:

    #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.



  • Bashar schrieb:

    Du kannst es auch direkt über Bitoperationen machen:

    #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.



  • Bit-Felder sehen so aus:

    struct Preferences {
        bool likesIceCream : 1;
        bool playsGolf     : 1;
        bool watchesTv     : 1;
        bool readsBooks    : 1;
    } Preferences;
    

    Siehe http://en.wikipedia.org/wiki/Bit_field
    Oder http://c-faq.com/struct/bitfields.html

    Und sind in der Tat unter Umständen Compiler unabhängig.


Anmelden zum Antworten