2012-08-25 74 views
0

的結構結構的數組我有這些結構:C:在陣列

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中使用複雜的結構呢?

+0

你剛剛來自PHP嗎? :-) –

+1

不是,來自PHP,來自JSON :) – balping

回答

1

不,這種用法是不可能的,至少不是在「舊」(C89)C中。結構文字不能用於初始化指針,因爲這並不能解決問題該結構位於內存中的哪個位置。

+0

在C99中可以嗎? – balping

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

應該是

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

因爲結構的陣列將鬆散單括號的聲明。

+0

你說得對,我已經編輯它,但它仍然無法正常工作 – balping

0

的問題是,你宣佈一個指向一個結構,但事實上,你想結構的數組。大多數的時間struct name*struct name[]將「互換」(已讀k & R鍵看到,他們是不一樣的東西),但在靜態初始化的情況下,它必須聲明爲一個數組,因此編譯器可以預期它是固定的大小,因此它可以確定要用於結構的內存量。

我需要改善我的答案,但我在這裏主要的一點是,我不希望像int a* = {3,3,4,5};編譯。首先,類型在作業的兩側是不同的。其次,編譯器如何知道它是數組的初始化列表而不是結構體?第三,它怎麼知道它應該期望4個元素而不是5個?

+0

行,那我應該在我的代碼改變? – balping

+0

也許你應該改爲'結構struct_name [3] = {{初始化列表1},{初始化列表2},{初始化列表3}};'那麼編譯器知道它必須準備3層結構。如果你無法修復結構的數量,那麼你必須在其他次要初始化中破壞初始化,並在它們之間設置指針。 –