2

C99でここで間違っていること:

struct chess {
    struct coordinate {
        char piece;
        int alive;
    } pos[3];
}table[3] =
{
    {
      {'Q', (int)1},{'Q', (int)1},{'Q', (int)1},
      {'B', (int)1},{'B', (int)1},{'B', (int)1},
      {'K', (int)1},{'K', (int)1},{'K', (int)1},
    }
};

エラーが発生します:

error: expected ‘:’, ‘,’, ‘;’, ‘}’ or ‘__attribute__’ before ‘=’ token

次のような構造体内に構造体を持つように、データにアクセスできるようにしたいと考えています。

table[row].pos[column].piece
table[row].pos[column].alive

いくつかの組み合わせを試しましたが、このケースではうまくいかないようです。それが機能する前に、以前の構造体のハードコードされた初期化を行いましたが、今回のように構造体内の構造体ではありません。

助言がありますか?

4

2 に答える 2

4
struct chess {
    struct coordinate {
        char piece;
        int alive;
    } pos[3];
} table[3] =
{
    {
        .pos = {{ .piece = 'Q', .alive = 1 },
                { .piece = 'Q', .alive = 1 },
                { .piece = 'Q', .alive = 1 }
               }
    },
    {
        .pos = {{ .piece = 'B', .alive = 1 },
                { .piece = 'B', .alive = 1 },
                { .piece = 'B', .alive = 1 }
               }
    },
    {
        .pos = {{ .piece = 'K', .alive = 1 },
                { .piece = 'K', .alive = 1 },
                { .piece = 'K', .alive = 1 }
               }
    }
};

うまくいくようです。中括弧の配置には注意してください。何を入力しているのかを理解するようにしてください。これは答えを読む方法です:

  1. table[3] は配列です。したがって、イニシャライザは「{」で始まり「};」で終わり、各要素は「,」で区切られます
  2. この配列の各要素は「構造チェス」です。したがって、各サブ要素は「{」で始まり「}」で終わります
  3. 各 'struct chess' には、配列 'pos[3]' があります。したがって、別のサブサブ '{' と '}'
  4. 各「pos」は構造体なので、サブサブサブ「{」と「}」があります
  5. いよいよ畑です。C99 初期化子リストを使用して、コードをよりクリーンにします。また、C の二重引用符は、char ではなく char* です。一重引用符を使用する

アドバイス :

  • 「読みにくい」コードの量を最小限に抑えるようにしてください。それはあなたに仕えます
  • ネストされた構造体を使用することはありません。必要に応じて、コードを分離し、それらを初期化する関数を作成します。
  • CPPReferenceは便利です
  • 構造体には適切な変数名と識別子を使用してください。「pos」を読むと、チェスの位置だと思います((x、y)座標と情報)。
于 2016-10-31T08:58:47.193 に答える