2014-07-04 145 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

相關問題