3

我正在尝试初始化一个结构,并将值分配给结构变量。

我的结构:

  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: Expected an expression。该错误发生在初始化代码的每一行。

我读到这是用 ANSI C99 编写时要走的路,但这在我的情况下不起作用。如何在 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};

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

4

3 回答 3

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 */
于 2012-08-07T08:50:07.247 回答
0

默认情况下 keil RCVT 使用 C90 标准。如果你想为你的结构初始化使用这样的语法,你可以在编译器选项中添加“--c99”:目标选项 -> C/C++ -> 其他控制。

源码keil在线支持

于 2014-03-26T13:32:08.743 回答
0

State数组应初始化为:

.State = {0, 0, 0},
于 2012-08-07T08:27:04.233 回答