编辑:使用包含仿真EEPROM功能的Microchip引导加载程序。
我按照他们的例子声明了一个结构,只是我包含了一个数组而不是int somevar
。&eeVars
被传递给ezbl.h中所示的代码,问题是sizeof总是生成2
,所以我的数组中只有第一个成员是由EZBL_ModifyROM
编写的。如果我在EZBL_WriteROMObj
的最后一行添加一个*
,sizeof会给出正确的结果,并且所有内容都会被写入。
用于测试数组的ezbl.hif语句总是返回false。我测试了一个没有结构的数组,一个结构中的数组(如下所示),一个结构中的int somevar
,以及一个结构中的两个整型变量。
与always false if语句一起工作的唯一情况是单个int somevar
。通过将*
取消引用添加到else用例中,一切都会正常工作。有没有理由测试一个数组?这两个箱子有必要吗?
例如,此代码应在第一次加电时打印"65535“,在下一次加电时打印"10”,如果数组中的所有值都已写入,则在每次加电时加1。
EZBL_AllocFlashHole(emuEEData, 3072, 0x800, -1);
struct
{
int MY_LUT[101];
} eeVars;
int main(void) {
EZBL_ReadROMObj(&eeVars, EZBL_FlashHoleAddr(emuEEData)); //read the stored data
printf("%d", MY_LUT[10]);
if(eeVars.MY_LUT[10] == 0xFFFF) //check if any values present
{
int i = 0;
for (i=0;i<101;i++)
{MY_LUT[i] = 10;}
}
else
{
MY_LUT[10] = MY_LUT[10] + 1;
}
EZBL_WriteROMObj(EZBL_FlashHoleAddr(emuEEData),&eeVars); //write the data
}
有问题的ezbl.h代码
#define EZBL_WriteROMObj(destPgmAddr, srcRAMObjPtr)
{
EZBL_NVMKey = 0x03DF;
if(__builtin_types_compatible_p(typeof (srcRAMObjPtr), void*)) //always returns false
/* regular pointer case */ \
EZBL_ModifyROM((destPgmAddr), (srcRAMObjPtr), sizeof(*srcRAMObjPtr));
else /* array case */
EZBL_ModifyROM((destPgmAddr), (srcRAMObjPtr), sizeof(srcRAMObjPtr));
}
void EZBL_ModifyROM(unsigned long destPgmAddr, void *srcData, unsigned int byteLen);
发布于 2018-05-28 23:51:13
如果传入数组,sizeof
将以字节为单位返回数组的大小,例如:
int MY_LUT[101];
printf("%d", sizeof(MY_LUT)); //prints 101 * sizeof(int)
如果你传入一个指向一个包含数组的结构的指针,那么要获得该结构的完整大小,你应该取消对它的引用:
#define EZBL_WriteROMObj(destPgmAddr, srcRAMObjPtr)\
{\
printf("%d", sizeof(*srcRAMObjPtr));\
}
...
struct
{
int MY_LUT[101];
} eeVars;
...
EZBL_WriteROMObj(addr, &eeVars);
如果你知道你的结构只包含数组而不包含其他东西,你可以用sizeof(srcRAMObjPtr->MY_LUT)
得到数组的大小,但这会使代码更不灵活,当你可以简单地取消引用指针时,为什么要这样做呢?
EZBL_WriteROMObj
宏似乎试图确定传递的参数是否为数组,但这是错误的,因为void*
与struct eevars*
或任何其他指针不是同一类型。使用GNU扩展检查参数是否为数组的更好方法是:
#define EZBL_WriteROMObj(destPgmAddr, srcRAMObjPtr)\
{\
if(__builtin_types_compatible_p(typeof(srcRAMObjPtr), typeof(&(srcRAMObjPtr)[0])))\
{\
/* regular pointer case */ \
printf("%d\n", sizeof(*srcRAMObjPtr));\
EZBL_ModifyROM((destPgmAddr), (srcRAMObjPtr), sizeof(*srcRAMObjPtr));\
}\
else /* array case */ \
{\
printf("%d\n", sizeof(srcRAMObjPtr));\
EZBL_ModifyROM((destPgmAddr), (srcRAMObjPtr), sizeof(srcRAMObjPtr));\
}\
}
这样,您可以传递指向结构或数组的指针:
struct
{
int MY_LUT[101];
} eeVars;
...
EZBL_WriteROMObj(addr, &eeVars);
/* or: */
EZBL_WriteROMObj(addr, eeVars.MY_LUT);
https://stackoverflow.com/questions/50568123
复制相似问题