【发布时间】:2014-01-25 23:10:08
【问题描述】:
我对工会有点不熟悉,对它们进行了一些阅读,但无法弄清楚这一点。
有人为我定义了一个联合:
union CANDATA // Unionize for easier cooperation amongst types
{
unsigned long long ull;
signed long long sll;
u32 ui[2];
u16 us[4];
u8 uc[8];
u8 u8[8];
s32 si[2];
s16 ss[4];
s8 sc[8];
};
还有一个结构体将此联合作为其成员之一:
struct CANRCVBUF // Combine CAN msg ID and data fields
{ // offset name: verbose desciption
u32 id; // 0x00 CAN_TIxR: mailbox receive register ID p 662
u32 dlc; // 0x04 CAN_TDTxR: time & length p 660
union CANDATA cd; // 0x08,0x0C CAN_TDLxR,CAN_TDLxR: Data payload (low, high)
};
我正在创建一个 CANRCVBUF 实例:
static struct CANRCVBUF increasingMessage = {
0x44400000, /* 11 bit id */
0x00000002, /* 2 data bytes */
{
0x0000
}
};
接下来我要做的是创建一个循环来增加increasingMessage 的数据部分。这是我遇到麻烦的地方。我的尝试是:
if(increasingMessage.cd + 1 > 65535) {
increasingMessage.cd = 0x0000;
} else {
increasingMessage++;
}
我意识到通过使用increasingMessage.cd 我正在访问联合,而不是联合中的数据。我的问题是,创建increasingMessage时如何知道使用了哪个工会成员?
非常感谢任何提示
【问题讨论】:
-
例如通过:“increasingMessage.cd.ui[0]++”或“increasingMessage.cd.ull++”或任何你想在联合内增加的东西。