【问题标题】:too many initializers for structstruct 的初始化程序太多
【发布时间】:2016-08-24 07:37:29
【问题描述】:

我目前正在研究一个 EEprom 文件结构,该结构在编译时填充了默认值。到目前为止一切正常,除了一个结构,我似乎找不到错误..

typedef struct { // ===== instance parameters =====
        BOOL bInstanceActive; 
        BYTE nInstanceGrp[4];
        BYTE nEventFilter;
        BYTE nEventScheme;
        BYTE nEventPriority;
        BYTE nShortMul;
        BYTE nDoubleMul;
        BYTE nRepeatMul;
        BYTE nStuckMul;
        BYTE nDummy[3];
    } InstanceBlock;
#define DEFAULT_INSTANCE_BLOCK  {1, {255,255,255,255}, 244, 0, 2, 15, 5, 10, 30, {0}}

“BOOL”和“BYTE”类型都是无符号字符。

然后将不同的结构组合成一个 EEprom_Mapping 结构(但我目前只有这个,其他的都可以正常工作):

typedef struct {
    InstanceBlock xInstance[1];    ** edited should be 1 instead of 0
    } EEprom_Mapping;
#define DEFAULT_EEprom_Mapping { DEFAULT_INSTANCE_BLOCK }

然后以这种方式初始化:

EEprom_Mapping xEE __attribute__((section(".eeprom"))) = DEFAULT_EEprom_Mapping;

错误消息是“'InstanceBlock [0]' 的初始化程序太多”

提前感谢您的帮助。

【问题讨论】:

  • 它是 C 还是 C++?
  • 嗯,一大于零。无论如何,C++ 不允许零长度自动存储数组。
  • 请正确标记语言:这就是为什么这个原本不错的问题被否决了。
  • 因此,根据您的编辑,并根据您的评论,如果您将xInstance[0] 更改为xInstance[1] 他们就不再麻烦了,不是吗?
  • 是的,它解决了上面的问题@Garf365 也解决了 xInstance[4] 的另一个问题。感谢您的所有帮助,抱歉标记错误,这是我第一次在这里发帖。

标签: c++ struct avr atmelstudio


【解决方案1】:

您的数组xInstance 是一个大小为0 的数组,因此编译器会报错,因为您尝试将一个元素放入其中。

【讨论】:

  • 哇,对不起,我很愚蠢。这解决了一个块的问题,谢谢,但如果我尝试使用 xInstance[4] 的 4 个块和 DEFAULT_EEprom_Mapping 中的 4 个块,我会得到相同的错误..
【解决方案2】:

对于您的第二个隐藏问题,有 4 个元素,您错过了一些括号:

// Note double brackets
#define DEFAULT_EEprom_Mapping  {{ DEFAULT_INSTANCE_BLOCK, DEFAULT_INSTANCE_BLOCK, DEFAULT_INSTANCE_BLOCK, DEFAULT_INSTANCE_BLOCK }}

Demo

确实,xInstance 是结构内的一个数组,因此结构的初始化列表需要括号,数组的初始化列表需要括号。

【讨论】:

    猜你喜欢
    • 2022-01-12
    • 1970-01-01
    • 2014-02-04
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多