初始化指向结构的指针时类型不兼容
Incompatible types when initialising pointer to structs
我的代码中有以下内容,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'
您必须将地址指向指针。使用 &
运算符获取地址:
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
也 returns 具有相同值的指针,但指向不同的类型,指向整个数组的指针,并且很少是正确的)。
然而,结构体更多 "normal" 类型。您可以将它们用作值,例如将它们作为参数传递并将它们分配给相同类型的其他变量,因此您可以说例如 rdmRxBufA = rdmRxBufB;
,这是有效的分配。如果你想要地址,你需要 &
.
前三个是uint8_t
的数组。这意味着 dmxRxBuf 是指向第一个元素的指针,因此,uint8_t*
其他只是 RDMPacket
。如果你想传递他们的地址,你可以使用这个:
RDMPacket *pRDMWriteBuf = &rdmRxBufA;
RDMPacket *pRDMSpareBuf = &rdmRxBufB;
RDMPacket *pRDMReadBuf = &rdmRxBufC;
或者像 uint8_t
一样创建 RDMPacket
的数组
RDMPacket rdmRxBufA[];
RDMPacket rdmRxBufB[];
RDMPacket rdmRxBufC[];
使用没有索引的数组让数组衰减到指向它的第一个元素的指针。
这个
uint8_t * pDMXWriteBuf = dmxRxBufA;
与
相同
uint8_t * pDMXWriteBuf = &dmxRxBufA[0];
struct
不是数组,因此它们不会衰减。请改用 &
,即 Address Of
运算符。
RDMPacket * pRDMWriteBuf = &rdmRxBufA;
我的代码中有以下内容,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'
您必须将地址指向指针。使用 &
运算符获取地址:
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
也 returns 具有相同值的指针,但指向不同的类型,指向整个数组的指针,并且很少是正确的)。
然而,结构体更多 "normal" 类型。您可以将它们用作值,例如将它们作为参数传递并将它们分配给相同类型的其他变量,因此您可以说例如 rdmRxBufA = rdmRxBufB;
,这是有效的分配。如果你想要地址,你需要 &
.
前三个是uint8_t
的数组。这意味着 dmxRxBuf 是指向第一个元素的指针,因此,uint8_t*
其他只是 RDMPacket
。如果你想传递他们的地址,你可以使用这个:
RDMPacket *pRDMWriteBuf = &rdmRxBufA;
RDMPacket *pRDMSpareBuf = &rdmRxBufB;
RDMPacket *pRDMReadBuf = &rdmRxBufC;
或者像 uint8_t
一样创建RDMPacket
的数组
RDMPacket rdmRxBufA[];
RDMPacket rdmRxBufB[];
RDMPacket rdmRxBufC[];
使用没有索引的数组让数组衰减到指向它的第一个元素的指针。
这个
uint8_t * pDMXWriteBuf = dmxRxBufA;
与
相同uint8_t * pDMXWriteBuf = &dmxRxBufA[0];
struct
不是数组,因此它们不会衰减。请改用 &
,即 Address Of
运算符。
RDMPacket * pRDMWriteBuf = &rdmRxBufA;