gpt4 book ai didi

c - 在c中增加 union 数据

转载 作者:行者123 更新时间:2023-11-30 15:39:39 25 4
gpt4 key购买 nike

我对 union 有些不熟悉,读过一些关于它们的书,但很难弄清楚这一点。

有人为我定义了一个 union :

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];
};

还有一个结构体将此 union 作为其成员之一:

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
}
};

接下来我想做的是创建一个循环来增加incrementingMessage的数据部分。这就是我遇到麻烦的地方。我的尝试是:

if(increasingMessage.cd + 1 > 65535) {
increasingMessage.cd = 0x0000;
} else {
increasingMessage++;
}

我意识到通过使用increasingMessage.cd我正在访问 union ,而不是 union 中的数据。我的麻烦是,我如何知道创建incrementingMessage时使用了 union 体的哪个成员?

非常感谢任何提示

最佳答案

您需要提供您正在向哪些 union 成员致辞。编译器需要知道您是否要测试 ull (作为 unsigned long long)或 sc[0] (作为 unsigned char),或任何其他成员。

在您的情况下,您可能想使用

if(increasingMessage.cd.us[3] + 1 > 65535) {
...

——也就是说,如果 union 的这一部分您要查找的数字。 (从您的代码中并不完全清楚。)

union 成员的访问方式与结构成员相同,唯一的区别是它们的存储方式不同。

<小时/>

请注意,我选择的特定字段永远不会>65535 ...因此请仔细选择您的测试成员...

关于c - 在c中增加 union 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21357445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com