2015-08-13 114 views
0

我正在爲包含兩個用於請求和響應的c結構的項目編寫通信協議。根據設備的設置方式,數據傳輸可以是請求(主模塊)或響應(從模塊)。使用變量鑄造C結構

結構非常接近。最大的區別是請求的結構與響應的結構。

我有保持上述指針被定義爲

unsigned int MBData; 

MBData = gCommResponse; 

當引用的代碼中的全局變量的變量,我要麼必須

((MBResponse*)MBData)->Address = someData; 

((MBResponse*))MBData)->Address = someData; 

這代碼是成功的,但希望通信功能更模糊。

我想要做的是使用指向MBRequest或MBResponse的指針來投射MBData。

unsigned int MBStruct; 

MBStruct = &MBResponse; 

((MBStruct*)MBData)->Address = someData; // Something like this 

這是可能的C編程?

謝謝。

+3

**不要將'int'投射到指針上,反之亦然** – Olaf

+0

@Olaf:你是什麼意思?我有一個變量,將保存C結構的內存位置。我分配了c結構的地址並將其用作我的演員的一部分。我不是試圖做'u16 * ptr =(int)12;' – user3826668

+3

'MBStruct'是一個'unsigned int',你指定一個指針。這顯然是錯誤的!如果您不知道如何正確使用指針,請先閱讀C書。這在C中是**重要的知識。正確的做法是使它成爲'MBResonse'類型的指針。使用'void *'應該是最後一次重新編譯並且很合理。 – Olaf

回答

0

這是不可能的。當訪問結構成員時,編譯器需要在編譯時知道結構的類型。

雖然這兩個結構體可能具有通用名稱的字段,但不能保證它們是相同(或兼容)類型,或者它們生活在相應結構中的相同偏移量處。

0

您可以將這兩個結構體編寫爲聯合體,並通過知道您是從機還是主機來訪問相應的字段。這假定服務器發送一個客戶期望格式的數據包,反之亦然。

爲確保發送方和接收方的平臺無關緊要,您必須對數據包進行序列化,或者使用其他協議來對數據包進行編碼和解碼。