'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;
我有一个 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;