2014-01-29 2 views
0

У меня есть вложенная структура определяется следующим образом:Вложенные структуры в C говоря «предупреждение: сравнение между указателем и целое»

/* 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 

Я думаю, Я обволакиваю то, что происходит с указателями здесь, но я пытаюсь получить доступ к значению id pfifo1:

if(&pfifo1->R.id == 0x44200000) { // Message to toggle blue led 
    toggle_led(15); 
} 

Это дает мне предупреждение warning: comparison between pointer and integer для этой строки. Моя мысль заключалась в том, что &pfifo1->R доставит мне структуру CANRCVBUF, из которой я могу получить доступ к идентификатору, используя . ... к сожалению, похоже, не так.

ответ

3
&pfifo1->R.id 

Это приводит указатель на INT, то есть, это адрес R.id. Вам не нужен адрес оператора, если вы хотите сравнить R.id с 0x44200000

if(pfifo1->R.id == 0x44200000) 

Помните; -> разыгрывает указатель, поэтому нет необходимости в & (не то, что вам это понадобится в любом случае), а -> имеет более высокий приоритет, чем &.

2

Вы близко. &pfifo1->R.id доставит вам адрес поля id, но вы хотите сравнить его значение. Для этого просто удалите адрес-оператора (&).

if(pfifo1->R.id == 0x44200000) { // Message to toggle blue led 
    toggle_led(15); 
} 
Смежные вопросы