2017-08-01 67 views
1

我正在嘗試構建樹形菜單結構。初始化全局數組的結構樹C

我聲明項:

typedef struct menu_item_struct menu_item; 
typedef int (*menu_action) (menu_item *item); 
typedef bool (*menu_is_selected) (menu_item *item); 

struct menu_item_struct{ 
    char *text; 
    menu_action action; 
    menu_is_selected is_selected; 
    int subitems_count; 
    int id; 
    menu_item *subitems; 
    menu_item *parent; 
}; 

首先我想這個代碼,它工作得很好:

menu_item main_menu = { 
    .text = "Top level", 
    .action = 0, 
    .parent = 0, 
    .id  = 0, 
    .subitems_count = 3, 
    .subitems = &(menu_item[3]) 
    { 
     { 
      .text = " ..", 
      .action = 0, 
      .parent = 0, 
      .id  = 0, 
      .subitems_count = -1, 
      .subitems = 0 
     }, 
     { 
      .text = "Subitem 1 level 1", 
      .action = 0, 
      .parent = 0, 
      .id  = 0, 
      .subitems_count = 2, 
      .subitems = &(menu_item[2]) 
      { 
       { 
        .text = " ..", 
        .action = 0, 
        .parent = 0, 
        .id  = 0, 
        .subitems_count = -1, 
        .subitems = 0 
       }, 
       { 
        .text = "Sub 1 item level 2", 
        .action = 0, 
        .parent = 0, 
        .id  = 0, 
        .subitems_count = 0, 
        .subitems = 0 
       } 
      }   
     }, 
     { 
      .text = "Subitem 1 level 1", 
      .action = 0, 
      .parent = 0, 
      .id  = 0, 
      .subitems_count = -1, 
      .subitems = 0 
     } 
    } 
}; 

這是確定的小菜單。但是對於大的我試圖把它分成幾個變量。例如。 「後退」項目出現在所有子菜單中。所以,現在

menu_item menu_back = { 
    .text = " ..", 
    .action = 0, 
    .parent = 0, 
    .id  = 0, 
    .subitems_count = -1, 
    .subitems = NULL 
}; 

當我嘗試

menu_item main_menu = { 
    .text = "Menu", 
    .action = 0, 
    .parent = 0, 
    .id  = 0, 
    .subitems_count = 1, 
    .subitems = &(menu_item[1]) { 
     menu_back 
    } 
}; 

我得到「初始化變量不是一個常量」:因此,我宣佈它作爲獨立的變量。

我只是想知道構建常量靜態菜單樹的最佳方式是什麼?

+0

當然不是。但我不明白你的問題。你的第一個聲明並不是恆定的,但初始化者在編譯器理解中是不變的。第二個在全局/靜態作用域中無效。 –

+0

問題是如何使第二個在全球範圍內有效。 或任何其他方法來構建大型多級菜單 –

+0

您不能使用變量來初始化全局/靜態變量。 C不允許這樣做,因爲全局/靜態變量在主程序啓動之前被初始化,並且初始化需要常量值。 –

回答

4

正如你發現你不能使用變量的內容來初始化靜態變量。但是你可以使用一個變量的地址來初始化靜態變量。換句話說,創建指針列表到對象,而不是直接的對象列表。

但是,你很快就會發現這樣做很笨拙。你會有很多變量,你要處理。如果您必須更改menu_item_struct定義,則必須手動編輯所有初始化。所以,從經驗,避免在純C這樣做。相反:

  1. 以您喜歡的層次結構文本文件格式(JSON,XML,...)定義菜單。
  2. 使用您最喜歡的腳本語言(Python,...)來讀取文本文件,然後寫出包含菜單變量的C文件。
  3. 編譯並鏈接生成的C文件與其他項目文件。
+0

謝謝。這可能是一個解決方案 –