union verwenden



  • hi,

    ich möchte eine union verwenden,

    definiert man das so richtig?

    union can_frame_
    {
    	char frame_data[10];
    
    	typedef struct can_frame
    	{
    		char can_id[2];
    
    		union can_data_
    		{
    			char can_data[8];
    
    			typedef struct can_data
    			{
    				char sub_addr_command[1];
    				char channels[3];
    				char control_data[4];
    			}can_data;
    		};
    	};
    };
    


  • achtung c++ code;)

    ich möchte gerne sowas in der art verwenden, ist bitset<1> 1 byte gross?

    union can_frame_
    {
        char frame_data[10];
    
        typedef struct can_frame
        {
            std::bitset<2> can_id;
    
            union can_data_
            {
                std::bitset<8> can_data;
    
                typedef struct can_data
                {
                    std::bitset<1> sub_addr_command;
                    std::bitset<3> channels;
                    std::bitset<4> control_data;
                }can_data;
            };
        };
    };
    


  • ros schrieb:

    ist bitset<1> 1 byte gross?

    das glaube ich weniger. aber am besten, du fragst sowas eine etage tiefer.
    🙂



  • dh das union konstrukt kann ich übern jordan werfen?



  • ros schrieb:

    dh das union konstrukt kann ich übern jordan werfen?

    nö, das hab' ich doch nicht gesagt, nur dass du fragen über dieses std::-geraffel lieber im c++ forun stellen solltest, weil die sich damit besser auskennen, als die leute, die hier rumschwirren.
    🙂



  • ein byte groß ist das ding so und so nicht, da es ja bitset und nicht byteset heißt.

    was du wahrscheinlich brauchst, ist:

    typedef struct can_data {
      int sub_addr_command:1;
      int channels:3;
      int control_data:4;
    }can_data;
    


  • typedef struct can_data {
      char sub_addr_command:1;
      char channels:3;
      char control_data:4;
    }can_data;
    


  • besserwisser schrieb:

    ein byte groß ist das ding so und so nicht, da es ja bitset und nicht byteset heißt.

    soll das heissen, dass das ding ein bit gross ist?
    🙂



  • Anstatt sowas wie die Größe von std::bitset<1> can_data; zu erfragen, hättest du dir auch einfach mal fix die Größe auf von std::bitset<1> auf deinem System mit std::cout << sizeof(can_data); (respektive printf - wir sind ja hier in ANSI C 🙂 ausgeben lassen können.



  • eine union darf nur PODs enthalten, also ist std::bitset verboten



  • was ist da falsch?

    union can_frame_
    {
    	char frame_data[10];
    
    	struct
    	{
    		char can_id[2];
    
    		union can_frame_data_
    		{
    			char can_data[8];
    
    			struct
    			{
    				char sub_addr_command[1];
    				char channels[3];
    				char control_data[4];
    			}can_data_;
    		};
    	}can_frame;
    };
    
    can_frame_ frame;
    frame.can_frame.can_frame_data_.can_data[0] = 1; // error: error: invalid use of `union can_frame_::<anonymous struct>::can_frame_data_'
    


  • Syntaktisch ist union wie struct:

    union <Tagname> { <Elemente> } <Instanzname>;
    

    Du definierst in der Struktur can_frame also eine union namens can_frame_data_. Aber Du definierst keine Instanz davon. Mach es wie bei der Struktur darüber.

    struct
        {
            char can_id[2];
    
            union 
            {
                char can_data[8];
    
                struct
                {
                    char sub_addr_command[1];
                    char channels[3];
                    char control_data[4];
                }can_data_;
            } can_frame_data;
        }can_frame;
    


  • // error: error: invalid use of `union can_frame_::<anonymous struct>::can_frame_data_'

    ^^ da fehlen teilweise namen für die structs und unions. machs z.b. so:

    struct a
    {
      union b
      {
         struct c
         {
            int d;
            ...
         } c; 
         ...
      } b;
    };
    
    struct a ein_a;
    ein_a.b.c.d = ...;
    

    die namen der structs/unions bzw. die member-namen können gleich sein. C kann die problemlos ausseinanderhalten. ausserdem könnteste noch typedefs verwenden, um das ganze lesbarer zu gestalten. da in der fehlermeldung diese seltsamen doppel-doppelpunkte auftauchen, nehme ich an, dass du einen c++ compiler verwendest. also nimm besser einen richtigen C-compiler, wenn du in C programmieren willst.
    🙂


Anmelden zum Antworten