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 mitstd::cout << sizeof(can_data);
(respektive printf - wir sind ja hier in ANSI Causgeben 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.