我有一个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);
编辑当我使用'{}'括号初始化数组时,会出现另一个错误“错误:声明中没有标识符”。当我使用'[]'括号时,这不会发生。
答案 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
在结构初始值设定项的变量之间也应该有=
。
附录:
正如其他人所指出的,你的代码很乱。
=
符号一般情况下,首先编写一些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名称。