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 コンパイラを使用しています。このコードをコンパイルすると、コンパイラはError #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++ -> その他の制御。

ソース キール オンライン サポート

于 2014-03-26T13:32:08.743 に答える
0

配列は次のStateように初期化する必要があります。

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