'错误';“在初始化多个结构

时间:2017-02-27 15:13:44

标签: c struct compiler-errors c89 hi-tech-c

我有一个structdef一个结构,紧接着我已经同时使用typedef'd结构声明并初始化了我想要的变量。

当我尝试编译代码时,没有与'hi_aud'相关的错误消息,但其余的结构会显示错误'错误:“;”预期'。该数组还会显示此警告,加上“错误:”}“预期”。

我正在使用Hi-Tech C编译器,它使用C90 ANSI C标准。

/* Due to C90, do not change order of vars in struct or else code will explode
 */
typedef struct alarm {
    const uint_fast32_t pattern[];
    const uint_fast8_t size;
    void (*toggle)(void);
    void (*off)(void);
    bool on;
    bool init;
    uint_fast8_t pos;
    uint_fast16_t start;
    uint_fast8_t overflows;
};

static struct alarm hi_aud {
    [108, 27, 108, 20, 108, 12, 108, 5],
    sizeof(hi_aud.pattern) / sizeof(*hi_aud.pattern),
    &sounder_toggle,
    &sounder_off,
};

static struct alarm med_aud {
    [255, 50, 50, 255],
    sizeof(med_aud.pattern) / sizeof(*med_aud.pattern),
    &sounder_toggle,
    &sounder_off,
};

static struct alarm lo_aud {
    [255],
    sizeof(lo_aud.pattern) / sizeof(*lo_aud.pattern),
    &sounder_toggle,
    &sounder_off,
};

static struct alarm hi_vis {
    [255],
    sizeof(hi_vis.pattern) / sizeof(*hi_vis.pattern),
    &hi_vis_toggle,
    &hi_vis_off;
};

static struct alarm med_vis {
    [255],
    sizeof(med_vis.pattern) / sizeof(*med_vis.pattern),
    &med_vis_toggle,
    &med_vis_off,
};

static struct *alarms = {&hi_aud, &med_aud, &lo_aud, &hi_vis, &lo_vis};
static uint_fast8_t alarms_siz = sizeof(alarms) / sizeof(*alarms);

编辑当我使用'{}'括号初始化数组时,会出现另一个错误“错误:声明中没有标识符”。当我使用'[]'括号时,这不会发生。

3 个答案:

答案 0 :(得分:3)

在一个strcut的定义中,元素'定义由;分隔,不是, 不是问题:}

  • 在C99之前,初始化列表可能不会以,结束。 因枚举的C99更改而感到困惑。以{{1}结束它总是错的。并且变量与其初始值之间需要;

  • 要初始化结构的数组成员,请使用花括号(=),而不是括号({})。

  • []不是完整的数组定义。

    改为使用const uint_fast32_t pattern[];

答案 1 :(得分:0)

初始化数组的正确方法是使用花括号,而不是方括号:

static struct alarm hi_aud = {
    {108, 27, 108, 20, 108, 12, 108, 5},              /* Initialize "pattern") */
    sizeof(hi_aud.pattern) / sizeof(*hi_aud.pattern), /* Initialize "size"     */

<小时/> 假设你已经正确地声明了struct alarm(并且你没有得到它,因为你错过了typedef的第二部分):

您的代码是:

static       - This variable will have file-local scope.
struct alarm - The type of the variable.
hi_aud       - The name of the variable
{...}        - The structure initializers

在结构初始值设定项的变量之间也应该有=

附录:

正如其他人所指出的,你的代码很乱。

  • 您没有完成typedef。
  • 您似乎在使用不支持它们的语言中使用可变长度数组
  • 您的VLA位于一个结构的中间,该结构的注释表明该结构可能会“爆炸”。
  • 在初始化结构时,您错过了=符号
  • 您没有正确初始化数组。
  • 您的阵列大小各不相同。
  • 你有逗号逗号和错误的半冒号等等。

一般情况下,首先编写一些TINY代码,编译它,调试它 然后再添加一点,编译并调试它 重复。

不要写几页垃圾,然后继续看,因为它不起作用。

为此,我们修复你的第一个typedef:

Typedef使用2个元素, TYPE ,以及类型的新 NAME

typedef {existing element} {new name};

你只投入上半场。

你想:

typedef struct alarm {  /* All the structure elements */ } alarm_t;

这会生成一个新类型alarm_t

之后,您尝试使结构的第一个元素为未定义大小的数组。 C允许灵活的数组成员,但仅作为结构的最后一个元素,并且使用起来很棘手。所以我要把你的数组固定大小:

typedef struct alarm {
    const uint_fast32_t pattern[10];  /* Fixed Size */
    const uint_fast8_t size;
    void (*toggle)(void);
    void (*off)(void);
    bool on;
    bool init;
    uint_fast8_t pos;
    uint_fast16_t start;
    uint_fast8_t overflows;
} alarm_t;

答案 2 :(得分:-1)

结构的typedef语法是:

str.split("list, ' ' ")

您还没有提供任何typedef名称。