我有一个3字节的变量,但由于C中没有3字节变量,我使用的是长32位。然后我想在总线上只发送3个字节。我作为ext Ram 8位宽度访问总线。 要只发送3个字节,我需要将long值分解为2字节(短)和1字节(字符)。
我所做的是:
typedef union
{
unsigned char b[3];
unsigned long lng;
} lng_array;
void SendLong(unsigned long d)
{
volatile void* c =(void*)Dat; // Dat is a #defined long number equal to the address on the bus that data must be sent
lng_array tmp;
tmp.lng=d;
*c=*(unsigned short*)(&tmp.b[0]); // Error
*c=*(unsigned char*)(&tmp.b[2]); // Error
}
表示2" * c ="我得到一个错误:"错误36无效使用void表达式"
我在这里做错了什么?
答案 0 :(得分:3)
*c
是c
,则 void*
没有意义(无法解除引用),因为编译器需要知道它的大小。再将其投放到unsigned char*
,例如:*((unsigned char*)(c)) = (unsigned char*)(&tmp.b[2]);
答案 1 :(得分:2)
由于变量c
是指向void的指针类型,因此您无法取消引用它(例如读/写*c
)。如果你想访问它所指向的内存,你必须添加一个类型转换。
C标准声明
6.3.2.2 void
void表达式的(不存在的)值(具有的表达式) 类型void)不得以任何方式使用,......
并且由于c
是指向void dereferencing的类型指针,因此它会生成一个void表达式,然后不能用于任何内容。无论等号的另一面是什么,与此无关。