'error ";" expected' 初始化多个结构时

'error ";" expected' when initialising multiple structs

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

当我尝试编译代码时,没有与 'hi_aud' 相关的错误消息,但其余结构会出现错误 'error: ";" expected'。阵列也提出了这个警告,加上 'error: "}" expected'.

我正在使用 Hi-Tech C 编译器 v.,它使用 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);

edit 当我使用'{}'括号初始化数组时,出现另一个错误"error: no identifier in declaration"。当我使用“[]”括号时不会发生这种情况。

结构的 typedef 语法是:

struct <optional struct name> {
    struct fields...
} <typedef name>;

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

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

  • 在 C99 之前,初始化程序列表可能不会以 , 结束。被 C99 对枚举的更改所混淆。; 结尾总是错误的。变量和它的初始化器之间需要有一个=

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

  • const uint_fast32_t pattern[]; 不是一个完整的数组定义。

    改用const uint_fast32_t pattern[MAX_SOMETHING];

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

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 位于一个结构的中间,该结构的注释表明该结构可能 "explode"。
  • 在初始化结构时,您缺少一个 = 符号
  • 您没有正确初始化数组。
  • 你们的数组大小都不一样。
  • 你有尾随逗号和错位的分号等等。

一般来说,先写一小段代码,编译,调试。
然后再加一点,编译调试。
重复。

不要写几页垃圾,然后惊奇地看着它不起作用。


为此,让我们修复您的第一个 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;