请考虑以下内容:
// main.h
struct
{
uint16_t aChargeOption0;
uint16_t aChargeOption1;
} oBattChargerInfo;
typedef struct CHGRRM
{
uint16_t nRegIndex;
uint8_t nDataType;
uint32_t nDataWidth;
uint32_t nRegAddress;
bool IsWritable;
bool HasBits;
uint32_t nBitStoreStart;
uint32_t nBitStoreEnd;
int *ptrToData;
} chargerRegMap_t;
extern chargerRegMap_t charger_reg_map[];
// main.c
chargerRegMap_t charger_reg_map[] =
{
{ &oBattChargerInfo.aChargeOption0 },
{ &oBattChargerInfo.aChargeOption1 },
};
// code to store a variable to the de-referenced variable
uint16_t aFinalBuff=0x00;
aFinalBuff=buff[1]<<8; // buff[0] and buff[1] is uint8
aFinalBuff=aFinalBuff+buff[0];
*charger_reg_map[nRegIndex].ptrToData=aFinalBuff;
当我存储第一个变量(在第一种情况下为charger_reg_map[0].ptrToData
的{{1}}时,16位变量将覆盖相邻的变量oBattChargerInfo.aChargeOption0
。除了将oBattChargerInfo.aChargeOption1
结构中的每个变量都设置为32位之外,还有其他解决方案吗?取消引用的变量会以这种方式工作似乎很奇怪。
我尝试了* charger_reg_map [nRegIndex] .ptrToData =(uint16_t)aFinalBuff; 明确我的意图。没关系。
我在这里做什么错了?
答案 0 :(得分:0)
如果要使用大小不同的变量,则没有可用于写入所有变量的指针类型。
设计有点脆弱,因为您需要知道指针指向哪个成员,或者至少知道其类型。
我认为一个更好的选择是通过一个函数与memcpy
一起工作,并向chargerRegMap_t
添加一个'size'成员以进行完整性检查。
类似
void write_data(chargerRegMap_t* map, void* data, size_t size)
{
assert(size == map->data_size);
memcpy(map->ptrToData, data, size);
}
/* ... */
uint16_t aFinalBuff = 0x00;
aFinalBuff = buff[1] << 8;
aFinalBuff = aFinalBuff + buff[0];
write_data(charger_reg_map + nRegIndex, &aFinalBuff, sizeof(aFinalBuff));
我可能还会在其中添加一个宏,以消除sizeof
的错别字并减少其乏味:
#define WRITE_DATA(map, data) write_data(map, &data, sizeof(data))
/* ... */
WRITE_DATA(charger_reg_map + nRegIndex, aFinalBuff);