-1

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

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

我正在使用 Hi-Tech C compiler 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);

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

4

3 回答 3

3

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

  • 在 C99 之前,初始化列表可能不会以,. 对枚举的 C99 更改感到困惑。以 a 结尾;总是错误的。=并且变量和它的初始化器之间需要有一个。

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

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

    改为使用const uint_fast32_t pattern[MAX_SOMETHING];

于 2017-02-27T15:17:53.377 回答
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 位于一个结构的中间,该结构有一条评论说该结构可能“爆炸”。
  • 在初始化结构时,您缺少一个=标志
  • 您没有正确初始化数组。
  • 你的数组大小都是不同的。
  • 您有尾随逗号和错位的分号等。

一般来说,首先编写少量代码,编译,调试。
然后再添加一点,编译并调试它。
重复。

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


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

Typedef 适用于 2 元素、TYPE和类型的新名称

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;
于 2017-02-27T15:20:20.920 回答
-1

结构的 typedef 语法是:

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

您没有提供任何 typedef 名称。

于 2017-02-27T15:17:34.670 回答