首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++中存在数组问题的结构

C++中存在数组问题的结构
EN

Stack Overflow用户
提问于 2018-05-28 22:00:35
回答 1查看 225关注 0票数 -2

编辑:使用包含仿真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。

代码语言:javascript
复制
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代码

代码语言:javascript
复制
#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);
EN

回答 1

Stack Overflow用户

发布于 2018-05-28 23:51:13

如果传入数组,sizeof将以字节为单位返回数组的大小,例如:

代码语言:javascript
复制
int MY_LUT[101];
printf("%d", sizeof(MY_LUT)); //prints 101 * sizeof(int)

如果你传入一个指向一个包含数组的结构的指针,那么要获得该结构的完整大小,你应该取消对它的引用:

代码语言:javascript
复制
#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扩展检查参数是否为数组的更好方法是:

代码语言:javascript
复制
#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));\
    }\
}

这样,您可以传递指向结构或数组的指针:

代码语言:javascript
复制
struct
{
    int MY_LUT[101];
} eeVars;
...
EZBL_WriteROMObj(addr, &eeVars);
/* or: */
EZBL_WriteROMObj(addr, eeVars.MY_LUT);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50568123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档