簡體   English   中英

如何訪問嵌套在另一個結構中的結構成員(通過指針訪問)(也通過指針訪問)?

[英]How to Access a member of a Struct ( accessed via pointer) nested within another Struct (also accessed via pointer)?

我在訪問嵌套結構中的數據時遇到問題。 我正在嘗試實現兩個 MCU 之間的 SPI 通信。 這個想法是為嵌套在處理程序中並在傳輸之前序列化的其他函數提供易於操作的結構。 但是,在序列化期間訪問結構不起作用。

我試圖在下面創建我的數據結構的簡化模型。

typedef struct a_t{
 uint16_t  member1;        
 uint8_t   member2;
} a_t;

typedef struct b_t
{
 volatile a_t* aPtr;
 volatile uint8_t arrayC[3];
} b_t;

a_t a;
a.member1 = 0xABCD;
a.member2 = 0xEF;

b_t b;
b_t* bPtr = &b;

bPtr->aPtr = &a;

據我了解, struct b現在包含一個指向 struct abPtr指向 struct b的指針。 所以如果我取消引用

bPtr->aPtr 

我應該得到一個指向 Struct a的指針。 如果我進一步取消引用,我應該能夠訪問這樣成員

bPtr->arrayC[0] = (((bPtr->aPtr->member1) >> 8) & 0xFF);
bPtr->arrayC[1] = ((bPtr->aPtr->member1) & 0xFF);
bPtr>arrayC[2] = bPtr->aPtr->member2;

這應該導致arrayC包含以下數據:

bPtr->arrayC[0] == 0xAB;
bPtr->arrayC[1] == 0xCD;
bPtr->arrayC[2] == 0xEF;

可悲的是,我找不到我的代碼就是這種情況。 在我的情況下,如果我嘗試像上面所示那樣分配它們, arrayC的值如下

bPtr->arrayC[0] == 0x00;
bPtr->arrayC[1] == 0x00;
bPtr->arrayC[2] == 0x00;

如果我按以下方式分配值

bPtr->arrayC[0] = 0xAB;

值按預期更改,因此錯誤必須在表達式中

(((bPtr->aPtr->member1) >> 8) & 0xFF);
((bPtr->aPtr->member1) & 0xFF);
bPtr->aPtr->member2;

如果這是一個愚蠢的問題,我很抱歉,我可以在其他帖子中找到一些雙指針引用。 但是我沒有找到解釋為什么我的解決方案在其他地方不起作用,所以如果有經驗的程序員能夠向我解釋我的錯誤,我將不勝感激。

編輯:我糾正了模型中的一個錯誤,其中我錯誤地將成員bPtr->aPtr稱為b->a

Edit2:使用以下編譯器測試時,取消引用確實有效

godbolt.org/z/Wdcahndxh

然而,相同的代碼在我的 MCU 中產生 0x00(MCU:MKE02Z 處理器:Cortex M0+ 編譯器:ARM6 C99)

我很抱歉。 我發現了我的錯誤。 我切換了初始化函數的參數順序,並錯誤地將指向 rxBuffer 的指針放入了 SPI 處理程序的 txbufferptr。 rxBuffer 是空的,因此只產生 0。

我感謝所有花時間幫助我的人。 我比較新,我應該刪除這個問題嗎? Stackoverflow 警告我,我可能會被阻止詢問我是否這樣做。

先生,

據我了解,結構 b 現在包含一個指向結構 a 而 bPtr 指向結構 b 的指針。 所以如果我取消引用

對不起,這是錯誤的,你必須從那里重構,你需要使用結構成員來存儲地址,而不是結構名稱:

// b_t struct has a member named aPtr, by sure you must
// store the address of a here
b.aPtr = &a;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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