2014-07-04 76 views
-1

我在IAR Embedded workbench IDE中编写了c代码。我在头文件中有以下内容。错误[Pe142]:表达式必须具有指针对象类型

typedef union { 
uint8_t payload; 
struct UBX_NAV_POSLLH nav_posllh; 
struct UBX_NAV_STATUS nav_status; 
struct UBX_NAV_DOP  nav_dop; 
struct UBX_NAV_SOL  nav_sol; 
struct UBX_NAV_VELNED nav_velned; 
struct UBX_NAV_TIMEUTC nav_timeutc; 
struct UBX_NAV_SVINFO nav_svinfo; 
} UBXPayload; 

struct UBXHeader { 
uint8_t class; 
uint8_t id; 
uint16_t len; 
uint8_t ck_a; 
uint8_t ck_b; 
}; 

struct UBXPacket { 
struct UBXHeader header; 
UBXPayload payload; 
}; 

这里是我的源文件:

static char *c_buffer 
void myinit() 
{ 
    c_buffer= (char*)malloc(50); 
} 
int myfunc(uint8_t c, char *c_buffer) 
{ 
    static uint8_t rx_count = 0; 
    struct UBXPacket *ubx = (struct UBXPacket *)c_buffer; 
    for(int i=0; i<3; i++){   
    ubx->payload.payload[rx_count] = c; /* Error[Pe142]: expression must have pointer- to-object type */ 
    rx_count++; 
    } 
} 

void main() 
{ 
    char mychar = 'h'; 
    myinit(); 
    myfunc(mychar, c_buffer); 
} 

同样工会被定义为写入与ARM GCC编译器编译另一代码示例如下。它很好地编译了&。

typedef union { 
uint8_t payload[0]; /* here [0] is placed */ 
struct UBX_NAV_POSLLH nav_posllh; 
struct UBX_NAV_STATUS nav_status; 
struct UBX_NAV_DOP  nav_dop; 
struct UBX_NAV_SOL  nav_sol; 
struct UBX_NAV_VELNED nav_velned; 
struct UBX_NAV_TIMEUTC nav_timeutc; 
struct UBX_NAV_SVINFO nav_svinfo; 
} UBXPayload; 

但在IAR C编译器给出错误。有什么建议吗? 我不明白以下行

struct UBXPacket *ubx = (struct UBXPacket *)c_buffer; 
+0

正如你对答案的评论所证明的,这个问题并不完全准确。看起来你已经从原始代码修改了联合; *原始*代码在GCC中编译,但是这个代码在*任何*编译器中都不起作用。你应该详细说明你的改变 - 或者更好,只是询问原来的问题,而不是你有缺陷的解决方案。 – Clifford

回答

1

UBXPayload工会​​成员是单个字符,但你把它作为一个数组。当你将它设为一个数组时,你可以将它设为一个大小为零的数组,因此所有对该数组的写入都将超出范围,从而导致undefined behavior(所以它的效果不如你想象的那么好)。

+0

感谢您的回复。我不明白为什么类似的代码在GCC编译器中编译。有什么不同 ?如何纠正这个错误。 – Armfan

+0

@Armfan通过将'payload'设置为非零数组来解决错误。要么它使它成为一个指针,并在需要时动态(重新)分配。不,如果它不是数组,编译器(甚至GCC)都不会编译它。 –

+0

您是否介意询问您是否在以下链接中提及某些代码。行号97. http://reviews.openpilot.org/browse/~br=next/OpenPilot/flight/modules/GPS/UBX.c?r=80d7363dfa0bc5f92d26c9cd4bb737d576d25de8 我不明白它是如何工作的。 – Armfan

相关问题