2016-04-27 15 views
0

私は自分の英語がこれに関する他の記事を理解するのが難しいと思っています。しかし、とにかく:Cプログラミング - 柔軟な配列メンバーの静的ではない初期化

私はちょうど私がカードのセットを格納することができます(C言語で)プログラムを書くことができると思った。 複雑ではなく、カードの値と名前を保存して印刷するだけです。 私はCの初心者です。私の書籍の "Strings in Structures"セクションにあるので、自分で構造体を試してみたかったのです。これは、これまでのところ、私のコードです:

#include <stdio.h> 

struct card 
{ 
    int value; 
    char name[]; 
}; 

int main(void) 
{ 
    const struct card heart[13] = { {2,"two"}, {3,"three"}, {4,"four"}, {5,"five"}, {6,"six"}, {7,"seven"}, {8,"eight"}, {9,"nine"}, {10,"ten"}, {11,"jack"}, {12,"queen"}, {13,"king"}, {14,"ace"} }; 
    int i; 

    for (i = 0; i < 13; ++i) 
    { 
     printf("The card heart-%s has the value of %i", heart[i].name, heart[i].value); 
    } 

return 0; 

}

私はちょうどそれが動作するかどうかをテストしたかったので、私は単にコードでハートのカードを書きました。このファイルをコンパイルしたいのであれば、私のコンパイラ(gcc/mingw)は私に26のエラーを出します。それは言う: "(心臓[0]の初期化に近い)" "柔軟な配列メンバーの非静的初期設定" 私はこれを本当に理解していません。この本では、すべてが期待どおりに機能します。私は本のコードを再構築して名前を変更しようとしましたが、動作しません。私はそれが文字列の問題だと思う、もし私が整数だけを使うなら、すべてが動くからです。 すでに別の記事を読んでいると、すべての文字列を手動で割り当てる必要がありますが、コード例がありますが、すべての行が何を意味するのか分かりません。コピー+ペースト。

これはなぜ機能しないのですか教えてください。 PS:私は現在Windowsで書いていますので、説明するためにbashコマンドを使用しないでください。 私もドイツ語で、私の英語は「卵の黄色」ではなく、複雑な「文章」(私があなたが何を意味するかを知っていればいいと思います)と珍しい言葉を使わずに説明しようとします。

ありがとうございました!

+0

:これを実行する最も簡単な方法は次のようにあなたのstruct card定義を変更するだろうか? –

+0

カード名に 'char'sを割り当てる必要があると思われます。 'struct card'では' char name [] 'から' char name [16] 'に変更してみてください – yano

+1

または' const char * name'を試してみてください。 – user3528438

答えて

2

各カードの名前にはスペースが必要です。多分あなたは最初のシンプルな何かをコンパイルしてみてください、あなたの「コンパイラが26のエラーであなたをヒット」した場合

struct card 
{ 
    int value; 
    char name[16]; // doesn't have to be 16, but make sure it's large enough to hold each card name plus a '\0' terminator 
}; 
関連する問題