簡體   English   中英

初始化指向結構的指針時類型不兼容

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM