0

私はこれらの構造を持っています:

struct menu_item{
    int id;
    char *text;
};

struct menu_tab{
    char *label;
    unsigned char item_count;
    struct menu_item *items;
};

struct menu_page{
    char *label;
    unsigned char tab_count;
    struct menu_tab *tabs;
};

struct Tmenu{
    unsigned char page_count;
    struct menu_page *pages;
};

そして、メニューシステム全体を定義したいと思います。

struct Tmenu menu_test = {
    2,
    {
        "F1",
        2,
        {
            {
                "File",
                8,
                {
                    {1, "text  1"},
                    {2, "text2"},
                    {3, "text3333333"},
                    {4, "text4"},
                    {5, "Hello"},
                    {6, "42"},
                    {7, "world"},
                    {8, "!!!!!!!!"}
                }

            },
            {
                "File2",
                3,
                {
                    {11, "file2 text  1"},
                    {12, "blah"},
                    {13, "..."}
                }

            }
        }
    },
    {
        "F2",
        1,
        {
            {
                "File3",
                5,
                {
                    {151, "The Answer To Life"},
                    {152, "The Universe"},
                    {153, "and everything"},
                    {154, "iiiiiiiiiiiiiiiis"},
                    {42, "Fourty-Two"}
                }

            }
        }
    }
};

しかし、コンパイルしようとすると、 extra brace group at end of initializerエラーメッセージが表示されます。

私はそれを行うために多くの異なる方法を試しましたが、どれも成功しませんでした。では、このようにCで複雑な構造体を使用することは可能ですか?

4

3 に答える 3

1

いいえ、この使用法は、少なくとも「古い」(C89) C では不可能です。構造体リテラルを使用して、問題の構造体へのポインターを初期化することはできません。これは、構造体がメモリ内のどこにあるかという問題を解決しないためです。位置しています。

于 2012-08-25T13:16:41.630 に答える
0
struct Tmenu menu_test = {
    2,
    {
        "F1",
        2,
        {DATAFILE...},
        {DATAFILE2...}
    },

する必要があります

struct Tmenu menu_test = {
    2,
    {
        "F1",
        2,
        {
        {DATAFILE...},
        {DATAFILE2...}
        }
    },

構造体の配列は単一の中括弧の宣言を失うためです。

于 2012-08-25T13:23:10.137 に答える
0

問題は、構造体へのポインターを宣言したことですが、実際には構造体の配列が必要です。ほとんどの場合、「交換可能」struct name*struct name[]なります (K&R を読んで、それらが同じものではないことを確認してください)。ただし、静的初期化の場合は、配列として宣言する必要があります。これにより、コンパイラは、配列が固定サイズであると期待できるため、構造体に使用されるメモリの量を決定できます。

答えを改善する必要がありますが、ここでの主なポイントは、int a* = {3,3,4,5};コンパイルのようなものは期待できないということです。まず、割り当ての両側で型が異なります。第二に、それが構造体ではなく配列の初期化リストであることをコンパイラがどのように知ることができますか? 3 番目に、5 要素ではなく 4 要素を期待する必要があることをどのように知ることができますか?

于 2012-08-25T13:24:09.010 に答える