我的代码中有以下内容,RDMPacket
是在包含的头文件中定义的结构。前3个缓冲区指针(DMX缓冲区)工作正常但第二个3(RDM缓冲区)没有。难道我做错了什么?我怎么能用指针引用一组结构?
uint8_t dmxRxBufA[NumberOfChannels];
uint8_t dmxRxBufB[NumberOfChannels];
uint8_t dmxRxBufC[NumberOfChannels];
uint8_t *pDMXWriteBuf = dmxRxBufA;
uint8_t *pDMXSpareBuf = dmxRxBufB;
uint8_t *pDMXReadBuf = dmxRxBufC;
RDMPacket rdmRxBufA;
RDMPacket rdmRxBufB;
RDMPacket rdmRxBufC;
RDMPacket *pRDMWriteBuf = rdmRxBufA;
RDMPacket *pRDMSpareBuf = rdmRxBufB;
RDMPacket *pRDMReadBuf = rdmRxBufC;
uart.c:90:27: error: incompatible types when initializing type 'struct RDMPacket *' using type 'RDMPacket'
uart.c:91:27: error: incompatible types when initializing type 'struct RDMPacket *' using type 'RDMPacket'
uart.c:92:26: error: incompatible types when initializing type 'struct RDMPacket *' using type 'RDMPacket'
答案 0 :(得分:1)
您必须将地址放到指针中。使用&
运算符获取地址:
RDMPacket *pRDMWriteBuf = &rdmRxBufA;
RDMPacket *pRDMSpareBuf = &rdmRxBufB;
RDMPacket *pRDMReadBuf = &rdmRxBufC;
从问题来看有点不清楚,但是如果你真的想要结构数组,就像你有unit8_t
数组一样,那么就让它们成为结构数组:
RDMPacket rdmRxBufA[NumberOfChannels];
RDMPacket rdmRxBufB[NumberOfChannels];
RDMPacket rdmRxBufC[NumberOfChannels];
现在rdmRxBufA
等给指针指向数组的第一个元素,你可以再次直接指定指针。
如果您认为不需要&
运算符,您似乎对数组和结构的不同语义感到困惑。
对于int a[]
这样的数组,a
单独指定数组的第一个元素&(a[0])
。(旁注:&a
也会返回指针具有相同的值,但指向不同的类型,指向整个数组的指针,很少是正确的。)
然而,结构是更“正常”的类型。您可以将它们用作值,例如将它们作为参数传递并将它们分配给相同类型的其他变量,因此您可以说例如rdmRxBufA = rdmRxBufB;
,这是有效的赋值。如果您需要地址,则需要&
。
答案 1 :(得分:1)
前三个是uint8_t
的数组。这意味着dmxRxBuf是指向第一个元素的指针,因此,uint8_t*
其他只是RDMPacket
。如果你想传递他们的地址,你可以使用:
RDMPacket *pRDMWriteBuf = &rdmRxBufA;
RDMPacket *pRDMSpareBuf = &rdmRxBufB;
RDMPacket *pRDMReadBuf = &rdmRxBufC;
或者像创建uint8_t
一样创建RDMPacket
的数组
RDMPacket rdmRxBufA[];
RDMPacket rdmRxBufB[];
RDMPacket rdmRxBufC[];
答案 2 :(得分:0)
使用没有索引的数组让数组衰减到指向它的第一个元素的指针。
这个
uint8_t * pDMXWriteBuf = dmxRxBufA;
与
相同uint8_t * pDMXWriteBuf = &dmxRxBufA[0];
struct
不是数组,因此它们不会衰减。请改为使用&
,Address Of
- 运算符。
RDMPacket * pRDMWriteBuf = &rdmRxBufA;