我有一个嵌套结构,定义如下:
/* Buffering incoming CAN messages */
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)
};
struct CANRCVTIMBUF // CAN data plus timer ticks
{
union LL_L_S U; // Linux time, offset, in 1/64th ticks
struct CANRCVBUF R; // CAN data
};
我的变量声明如下:
static struct CANRCVTIMBUF* pfifo1; // Pointer to CAN driver buffer for incoming CAN msgs, high priority
我想我正在围绕这里的指针发生的事情,但我想要做的是访问pfifo1的id值:
if(&pfifo1->R.id == 0x44200000) { // Message to toggle blue led
toggle_led(15);
}
这为我提供了该行的警告warning: comparison between pointer and integer
。我的想法是&pfifo1->R
会得到CANRCVBUF
结构,我可以使用.
从中访问该ID ...但遗憾的是似乎并非如此
答案 0 :(得分:3)
&pfifo1->R.id
这导致指向int的指针,即它是R.id
的地址。如果要将R.id
与0x44200000
if(pfifo1->R.id == 0x44200000)
记住; ->
取消引用指针,因此不需要&
(不是您无论如何都需要它),并且->
的优先级高于&
。
答案 1 :(得分:2)
你很亲密。 &pfifo1->R.id
会为您提供id
字段的地址,但您希望比较其值。为此,只需删除address-of运算符(&
)。
if(pfifo1->R.id == 0x44200000) { // Message to toggle blue led
toggle_led(15);
}