将16位变量存储到取消引用的变量中写入32位

时间:2019-03-28 15:50:58

标签: c reference

请考虑以下内容:

// 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; 明确我的意图。没关系。

我在这里做什么错了?

1 个答案:

答案 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);