2010-10-06 74 views
2

我正在開發C固件項目。我有被定義爲並集,幫助鑄造指向工會的指針

typedef union { 
    unsigned long value; 
    unsigned char bytes[4]; 
} LONGVALUE; 

我也有具有該原型的功能,

char sendHexToASCII_UART(char *msg, int cnt); 

和定義爲類型的longValue的變量,

LONGVALUE countAddr; 

THE問題: 我使用數組中的值填充聯合變量的各個字節(tempBuff1),然後我想將聯合中第一個元素的地址傳遞給將要打印的函數它到UART。在我的函數調用sendHexToASCII_UART((int *)countAddr.bytes[0], 4);,我得到一個編譯器警告說:「從不同大小的整數轉換爲指針」。有人可以解釋爲什麼我得到這個以及如何讓它消失嗎?注意:將(int *)強制轉換爲(char *)將導致相同的警告。

countAddr.bytes[0] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS]; 
countAddr.bytes[1] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 1]; 
countAddr.bytes[2] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 2]; 
countAddr.bytes[3] = tempBuff1[COUNT_ADDR - PWRD_ADDRESS + 3]; 
sendHexToASCII_UART((int *)countAddr.bytes[0], 4); 

回答

4

爲什麼不只是:

sendHexToASCII_UART((char *)countAddr.bytes, 4); 

或甚至更好:

sendHexToASCII_UART((char *)countAddr.bytes, sizeof(countAddr.bytes)); 
+0

然後我得到:'警告:指針目標在通過「sendHexToASCII_UART」的說法1現在signedness' – PICyourBrain 2010-10-06 11:17:30

+0

更新應答不同...... – 2010-10-06 11:20:27

+0

我改變到(無符號字符*),我仍然得到相同的'不同sidnedness'警告 – PICyourBrain 2010-10-06 11:23:16

1

sendHexToASCII_UART((INT *)(& countAddr.bytes [0]),4);

或:

sendHexToASCII_UART((INT *)(countAddr.bytes),4);

0

表達

countAddr.bytes[0] 

的值是一個無符號的字符(您的陣列中的第一個字節),其中在投射到一個int指針,因此警告。正如奧利所說,你必須刪除[0]以獲得指向數組的指針,這正是你想要的。

+0

然後我得到:'警告:在傳遞'sendHexToASCII_UART'的參數1中的指針目標在簽名方面有所不同' – PICyourBrain 2010-10-06 11:19:58

+0

正確。正如Alex所建議的那樣,您最好的選擇可能是在這裏使用演員陣容,因爲您確實想要更改字節序列的解釋。 – 2010-10-06 11:31:07

0

或試試這個,而無需創建的longValue類型的變量

sendHexToASCII_UART(((LONGVALUE *)0)->bytes, 4);