我正在尝试初始化一个结构,并为结构变量赋值。
我的结构:
typedef struct { q31_t A0; q31_t A1; q31_t A2; q31_t State[3]; q31_t Kp; q31_t Ki; q31_t Kd; } arm_pid_instance_q31;
当我尝试声明并初始化变量时,我使用指定的初始值设定项:
arm_pid_instance_q31 pitch_pid_instance ={ .A0 = 0, .A1 = 0, .A2 = 0, .State ={0,0,0}, .Kd = 0, .Ki = 0, .Kp = 0 };
我正在将KeilμVision4和ARM C编译器用于嵌入式项目。 编译此代码时,编译器返回错误#29:预期表达式。初始化代码中的每一行都会发生错误。
我读到这是用ANSI C99编写时的方法,但这在我的情况下不起作用。 How to initialize a struct in ANSI C99
我知道我可以编写“坏”代码:
arm_pid_instance_q31 pitch_pid_instance; pitch_pid_instance.A0 = 0; etc...
但......
任何提示?
更新: 以下代码有效:
arm_pid_instance_q31 pitch_pid_instance = {0,0,0,0,0,0,0,0,0};
但同样,这不是一个特别的代码或方法。
答案 0 :(得分:1)
如果您要将所有内容初始化为0
,只需使用通用零初始化程序(并忽略编译器提供给您的任何虚假警告)。
通用零初始化程序是有效的C89,C99,C11(我相信它在C89之前也有效)。
arm_pid_instance_q31 pitch_pid_instance = {0};
struct somecomplexstruct array[1000] = {0};
......我相信你明白了这一点
如果你想初始化为0以外的值,并且你没有C99编译器,那么你需要单独进行,就像你的“坏”代码一样。
或者您可以将需要初始化的部分和复制(不初始化)它们分开
struct substruct {
q31_t Kp;
q31_t Ki;
q31_t Kd;
};
struct arm_pid_instance_q31 {
q31_t A0;
q31_t A1;
q31_t A2;
q31_t State[3];
struct substruct K;
};
struct substruct tmp = {42, -1, -1000};
struct arm_pid_instance_q31 pitch_pid_instance; /* uninitialized */
memcpy(&pitch_pid_instance.K, &tmp, sizeof tmp); /* copy values */
答案 1 :(得分:0)
State
数组应初始化为:
.State = {0, 0, 0},
答案 2 :(得分:0)
默认情况下keil RCVT使用C90标准。 如果要对结构初始化使用此类语法,可以在编译器选项中添加“--c99”:target options - > C / C ++ - > misc contronls。