2012-04-02 93 views
0

我想將一個使用gcc的項目移植到IAR編譯器,但IAR抱怨使用void *作爲形式參數的幾個函數。爲什麼IAR拋出void *

struct 
{ 
    uint16_t ConnectionHandle; 
    uint8_t Reason; 
}DisconnectParams; 

函數原型是

bool Bluetooth_HCI_SendControlPacket(BT_StackConfig_t* const StackState, 
            const uint16_t OpCode, 
            const uint8_t Length, 
            const void* Data); 

和使用是:

Bluetooth_HCI_SendControlPacket(StackState, (OGF_LINK_CONTROL | OCF_LINK_CONTROL_DISCONNECT), sizeof(DisconnectParams), &DisconnectParams); 

這裏抱怨 錯誤[Pe167]:的類型 「結構*」 的說法是與參數不相容鍵入「void const *」

而另一個地方

static inline void SDP_WriteData8(void** BufferPos,const uint8_t Data) 
{ 
*((uint8_t*)*BufferPos) = Data; 
*BufferPos += sizeof(uint8_t); 
} 

錯誤[Pe852]:表達式必須是指向完整對象類型的指針。 據我所知,void *可以接受任何指針,如何更改代碼以消除這些錯誤?謝謝!

克里斯

+0

您能否提供有關您的IAR版本和項目設置的更多詳細信息?我無法用IAR 5.40複製你的第一個問題。 – tinman 2012-04-02 15:00:21

+0

我的IAR是EWARM 6.30.1,設置爲C99並允許VLA(可變長度數組),但-vla似乎沒有效果,因爲它仍然抱怨當我定義一個變量數組時,表達式必須有一個常量值uint8_t Data [ DATALEN]; – user1308274 2012-04-02 15:11:53

+0

什麼是目標設備? – 2012-04-02 15:57:15

回答

3

在你的第二個問題方面的代碼是無效的,因爲你所擁有的是一個void *,你試圖通過的sizeof(uint8_t)來增加它(我假設1)。這相當於:

void *p; 
p += 1; 

你不能在具有不完全類型的指針進行指針arithmatic因爲編譯器不知道如何值由增加(還記得它的推移的對象指向的大小) 。

您可能打算在增量之前將指針轉換爲uint8_t指針。

+0

感謝您的回答。好的,我已經理解了你的答案。但另一個問題是gcc爲什麼可以編譯它。 – user1308274 2012-04-02 15:03:38

+0

也許有一個gcc擴展,它會自動假定你的意思是以字節爲單位添加,如果你將值添加到void指針?對不起,我不確定,因爲我不使用gcc。 – tinman 2012-04-02 15:12:10

+0

GCC確實有這樣的擴展:http://gcc.gnu.org/onlinedocs/gcc-4.7.0/gcc/Pointer-Arith.html#Pointer-Arith – 2012-04-02 15:45:54

0
#ifdef I_JUST_LOVE_MYSTERIOUS_COMPILER_ERRORS 
    struct 
    { 
    uint16_t ConnectionHandle; 
    uint8_t Reason; 
    }DisconnectParams; 
#else 
    typedef struct 
    { 
    uint16_t ConnectionHandle; 
    uint8_t Reason; 
    }DisconnectParams_t; 

    DisconnectParams_t DisconnectParams; 
#endif 
+0

這實際上有幫助嗎?如果是這樣,我不明白爲什麼 - 編譯器如何接受類型的地址作爲函數調用的參數?它甚至如何評估它? – 2012-04-02 15:52:35

+0

@MichaelBurr我不知道,有太多的信息可以告訴。這似乎是其中一個可能的問題。試一試。 – Lundin 2012-04-02 15:56:41

+0

@lundin - 它不起作用:struct {...} DisconnectParams定義了一個無名結構,並一次性聲明該類型的變量(名爲DisconnectParams); 'typedef struct {...} DisconnectParams'定義了一個無名結構併爲該類型聲明瞭一個同義詞(名爲DisconnectParams)。在第一種情況下DisconnectParams是一個變量,在第二種情況下是變量。在第二種情況下,使用'&DisconnectParams'調用'Bluetooth_HCI_SendControlPacket'肯定會是一個編譯器錯誤... – Attila 2012-04-02 16:00:34

相關問題