[英]Incompatible types when initialising pointer to structs
我的代碼中包含以下內容, RDMPacket
是在包含的頭文件中定義的結構。 前三個緩沖區指針(DMX緩沖區)可以正常工作,而后三個緩沖區指針(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
還返回具有相同值,但指向不同類型的指針,指向整個數組的指針,很少正確)。
但是,結構是更“普通”的類型。 您可以將它們用作值,例如將它們作為參數傳遞並將它們分配給相同類型的其他變量,因此可以說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
符的Address Of
。
RDMPacket * pRDMWriteBuf = &rdmRxBufA;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.