プロが教えるわが家の防犯対策術!

C言語のコンパイルエラーに関する質問です。
以下のような構造体の中に共用体を作成して、constで初期値を入れておきたいと考えています。
機械に適用する初期パラメータのような感じです。
「初期化子が多すぎます。」というコンパイルエラーがでるのですが、どこが多いのかわかりません。
どう修正すれば良のか教えていただけないでしょうか?

// 構造体定義
typedef struct {
Uint16_t time;
Uint8_t mode;
Uint16_t xxxx;
Uint16_t zzzz;
}PrgPatternA_t;

typedef struct {
Uint16_t time;
Uint8_t mode;
Uint16_t yyyy;
}PrgPatternB_t;

typedef struct {
Uint8_t pattern;
union {
PrgPatternA_t param_a[3];
PrgPatternB_t param_b[2];
}param;
} Program_t;

// 変数定義
EsCourseProgram_t ES_COURSE_PROG_DATA = {
PATTERN_A,
{ // Aパターン
// time mode xxxx yyyy
{ 10, MODE_A, 100, 50},
{ 10, MODE_A, 100, 50},
{ 10, MODE_A, 100, 50}
}
}

質問者からの補足コメント

  • すみません、間違えました。

    EsCourseProgram_t → Program_t
    と置き換えていただけると助かります。

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/09/13 13:38
  • アドバイスありがとうございます。
    最後の}は、実際は付けてコンパイルしております。(質問文には抜けていました。)
    相変わらず矢印行で、「Too many initializer values.」というエラーが発生してしまいます。
    unionとstructの使い方がそもそも間違っているのかと思っていましたが、やはり初期化の仕方が悪いのでしょうか?

    Program_t PROG_DATA = {
    0,
    { // Aパターン
    // time mode xxxx yyyy
    { 10, 0, 100, 50},
    { 10, 0, 100, 50}, ←←←←←←←
    { 10, 0, 100, 50}
    }
    }

    No.2の回答に寄せられた補足コメントです。 補足日時:2017/09/13 15:04
  • もしかして、unionで配列を定義してもリザーブされる領域は、添字数分ではなく、配列の1個分なのでしょうか?だから、配列3つ分で初期化しようとしているので、多すぎると言われている。
    そうすると納得できます。もしご存知でしたら教えてください。

      補足日時:2017/09/13 15:08
  • 自己解決いたしました。
    共用される部分は、PrgPatternA_tのサイズなので、配列は無効になっていました。ご回答くださいありがとうございました。

      補足日時:2017/09/13 15:18

A 回答 (2件)

EsCourseProgram_t の定義は?

この回答への補足あり
    • good
    • 0

どの初期値がどのメンバーに対応するかをじっと見ていくと, {} が 1つ足らない. つまり初期化子は


{
PATTERN_A,
{ // Aパターン
// time mode xxxx yyyy
{
{ 10, MODE_A, 100, 50},
{ 10, MODE_A, 100, 50},
{ 10, MODE_A, 100, 50}
}
}
}
でないといけない.

どこかの {} を忘れていたんだと思う. 共用体を初期化するときの {} かなぁ?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!