Union



  • Hallo Alle,
    ich habe:

    class cl{
      public:
      enum pos {x=1;y=2} 
      union a {
        int val;
        struct part {
          bool a:1;
          bool b:1
        }
      }
    }
    

    und will:

    cl cl;
      cl.a.value=cl::x|cl::y;
      cout << cl.a.value << endl;
      cout << cl.a.a << endl;
      cout << cl.a.b << endl;
    

    Aber mein Compiler meint:
    # invalid use of type decl `union cl::a' as expression

    Was mache ich falsch? Mit einer nameless-union tut das soweit, aber da das Bitfeld eigentlich grösser ist, versaue ich mir so den Namensbereich der Klasse.

    Danke
    Peanut



  • Oh. Shitt, C++ vorm ersten Kaffee sollte man lassen!
    Es muss:

    class cl{
      public:
      enum pos {x=1;y=2} 
      union {
        int val;
        struct {
          bool a:1;
          bool b:1
        } part;
      } a;
    };
    

    sein, dann tut es auch!

    PS: kann ein Mod mal beides löschen? SelfAnsweredPostings sind blöd!



  • Original erstellt von Peanut:
    kann ein Mod mal beides löschen? SelfAnsweredPostings sind blöd!

    Wohl kaum, stell Dir vor jemand hat genau das gleiche Problem wie Du hier, dann wird er sich über eine Antwort freuen, egal von wem sie kommt. (Immer unter der Voraussetzung dass dieser jemand klug genug ist, die Suche zu verwenden 😉 )



  • nur was bedeutet das:

    struct part {
    bool a:1;
    bool b:1

    ?



  • Das definiert ein Bitfeld.
    Ein bool belegt normalerweise 1 word. In einem Bitfeld kannst du es auf ein Bit beschränken. Durch das überlagern der struct und des int kann man über die struct auf die einzellnen bits des int zugreifen.
    Sinn:

    enum {lesen=4,schreiben=2,ausfuehren=1} recht;
    union {
      int recht;
      struct {
        bool ausfuehren:1;
        bool schreiben:1;
        bool lesen:1; 
      } darf;
    }user;
    user.recht=recht.lesen | recht.ausfuehren;
    if ( user.darf.ausfuehren ){
      cout << "ausfuehr, ausfuehr..." << endl;
    }
    

    [ Dieser Beitrag wurde am 18.05.2003 um 21:02 Uhr von Peanut editiert. ]



  • also kann ein bool dann den wert 7 oder 4 haben und sowas?



  • struct {
        bool ausfuehren:1;
        bool schreiben:1;
        bool lesen:1; 
      } darf;
    

    Ich glaub nicht, dass das klappt...
    Einzelne Bits lassen sich (auf unseren Rechnern) nicht adressieren. Also warum sollte der Compiler nicht einfach drei bool-Variablen (vermutlich Bytes) erstellen, und von jeder nur das erste Bit beachten?
    Wo steht geschrieben, dass alle 3 Bitfelder direkt nacheinander im selben Byte stehen müssen?

    edit:
    Es tut also. Na gut. 😕 🙄

    [ Dieser Beitrag wurde am 18.05.2003 um 21:32 Uhr von cd9000 editiert. ]


Anmelden zum Antworten