错误[P​​e142]:表达式必须具有指向对象的指针类型

时间:2014-07-04 06:13:25

标签: c embedded iar

我在IAR Embedded workbench IDE中编码c。我在头文件中有以下内容。

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编译器编译的代码示例中,相同的 union 定义如下。它汇编良好&amp;效果很好。

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;

1 个答案:

答案 0 :(得分:1)

UBXPayload联合中,payload成员是单个字符,但您将其用作数组。当你把它变成一个数组时,你就把它变成一个零大小的数组,这样对数组的所有写操作都会超出范围,导致undefined behavior(因此它的工作效果不如你想象的那么好)。