[英]copying data to data structure using memcpy
我正在嘗試從EEPROM讀取數據,並且有三種結構。
typedef struct
{
fract32 MechCoilPhiBase; // Mech Angle Table
fract32 MechCoilPhi3rd; // Mech Angle Table
fract32 PhiSaltwater; // Saltwater Table
UINT16 d;
UINT16 crc;
} ChannelData_T;
typedef struct
{
UINT32 reHarmonic;
UINT32 reFundamental;
UINT32 imgHarmonic;
UINT32 imgFundamental;
UINT16 crc;
} CoilBoard_T;
// mechanic angles and salt water angles of coil stored in coil-eeprom
typedef struct
{
ChannelData_T channel[NUM_CHANNELS];
CoilBoard_T coilboard;
// UINT32 gCoilSerialNumber;
// UINT32 gInversSerialNumber;
} Coil_Eeprom_Data_T;
我正在嘗試讀取數據,但是大小不是2的冪,我試圖填充數據,但是結構未正確填充。
我正在使用以下代碼從緩沖區讀取數據,並用結構填充它。 例如,crc變量為0,並且不能從緩沖區正確讀取。
這是我將數據復制到緩沖區的方法
memcpy( (void*) &CoilEepromData, (const void*) &EepromCoil.aRxData[0], sizeof(Coil_Eeprom_Data_T) );
extern volatile Coil_Eeprom_Data_T CoilEepromData;
extern volatile Eeprom_Coil_T EepromCoil; // control struct for the coil-eeprom
typedef struct
{
UINT8 crcValueOut;
UINT8 crcValueIn;
UINT8 pageAddress;
UINT8 dataLength;
UINT8 bytesToTransmit;
UINT8 bytesWritten;
UINT8 bytesToReceive;
UINT8 bytesRead;
UINT8 errorCount;
bool bWriteSucceed:1;
bool bStartup:1;
bool bReadingStarted:1;
UINT8 aTxData[COIL_SPI_BUFFER_SIZE];
UINT8 aRxData[COIL_SPI_BUFFER_SIZE];
} Eeprom_Coil_T;
不知道您對“二的冪”的評論意味着什么,如果這是一個要求,則必須使其更清楚。
另外,大多數在C中從void *
強制轉換/從強制void *
強制轉換的操作都是不必要的,您不應“為了安全起見”進行操作。 從您發布的代碼中很難理解為什么需要強制轉換。
最后,請記住結構也是值,您可以使用簡單的舊賦值:
CoilEepromData.channel[0] = EepromCoil.aRxData[0];
CoilEepromData.channel[1] = EepromCoil.aRxData[1];
CoilEepromData.channel[2] = EepromCoil.aRxData[2];
編譯器可能會將其優化為單個memcpy()
調用,但這要好得多,因為它更易讀,更容易正確。 您可能希望將其放在一個循環中,以減少索引錯誤的風險。
如果您真的想使用memcpy()
,則方法如下:
memcpy(&CoilEepromData.channel[0], &EepromCoil.aRxData[0], sizeof CoilEepromData.channel[0]);
這在目標變量而不是類型上使用sizeof
。 這樣比較安全。 同樣,這在循環中會很好:
for(size_t i = 0; i < sizeof CoilEepromData.channel / sizeof CoilEepromData.channel[0]; ++i)
memcpy(&CoilEepromData.channel[i], &EepromCoil.aRxData[i], sizeof CoilEepromData.channel[i]);
for
標題的第二部分中的sizeof
是為了避免硬編碼數組長度。 當然,這有點嚇人,因為它要求源數組和目標數組的長度都相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.