2010-10-06 71 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);