使用嵌入式C中的指定初始化程序初始化struct。“期望表达式”

时间:2012-08-07 08:22:58

标签: c struct initialization keil

我正在尝试初始化一个结构,并为结构变量赋值。

我的结构:

  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};

但同样,这不是一个特别的代码或方法。

3 个答案:

答案 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。

source keil online support