2015-02-08 32 views
-1

我正在为一个小型arduino项目编写16x2 LCD的菜单。 我差不多完成了,但我不明白最后一个小问题。Arduino在使用引用另一个struct中的struct时编译错误

以下(简化的)码产生问题:

sketch_feb08a.ino:24:53: error: cannot convert 'Select_Item* (*)[2]' to 'Select_Item*' in initialization 

在我是从变量和节目访问值的代码:

int var1=0; 
int var2=0; 

typedef struct { 
    unsigned int item_value; 
    char item_name[17]; 
} Select_Item; 

typedef struct { 
    char item_name[17]; 
    int* variable; 
    Select_Item* list; 
} Menu_Item; 

Select_Item sel_one = { 0, "Selection 1" }; 
Select_Item sel_two = { 1, "Selection 2" }; 
Select_Item* sel_list[2] = { &sel_one, &sel_two }; 

Menu_Item menu_item1 = { "Item 1", &var1, NULL }; 
Menu_Item menu_item2 = { "Item 2", &var2, &sel_list }; 
Menu_Item* menu_list[2] = { &menu_item1, &menu_item2 }; 

它与以下错误结束它在显示器中,一旦编辑,我可以把它写回变量。只要我只有数字来显示/编辑,那不是问题。 现在为了方便使用,我想添加一些选项菜单,用户可以从选项中进行选择。应该显示item_name而不是原始值,但当然应该在场景后面使用item_value。 这就是为什么我引入了Select_Item结构。

我不明白错误消息。这里有什么问题?

+0

错误很明显。 '&sel_list'是一个指向数组的指针,或者'Select_Item *(*)[2]'。而'Menu_Item :: list'是指向'Select_Item'或'Select_Item *'的指针。 – 2015-02-08 18:22:32

+0

你能提出一个可编译的替代方案吗? – 2015-02-08 18:56:40

+0

真的不清楚你在做什么...... – 2015-02-08 18:59:20

回答

0

我认为你正在试图做的是这样的:

int var1=0; 
int var2=0; 

typedef struct { 
    unsigned int item_value; 
    char item_name[17]; 
} Select_Item; 

typedef struct { 
    char item_name[17]; 
    int* variable; 
    Select_Item* list; 
} Menu_Item; 

Select_Item sel_one = { 0, "Selection 1" }; 
Select_Item sel_two = { 1, "Selection 2" }; 
Select_Item sel_three = {2, "Selection 3" }; 
Select_Item sel_four = {3, "Selection 4" }; 

Select_Item* sel_list_1[] = { &sel_one, &sel_two }; 
Select_Item* sel_list_2[] = { &sel_three, &sel_four }; 

Menu_Item menu_item1 = { "Item 1", &var1, sel_list_1[0] }; // Note the syntax here 
Menu_Item menu_item2 = { "Item 2", &var2, sel_list_2[0] }; // Note the syntax here 
Menu_Item* menu_list[2] = { &menu_item1, &menu_item2 }; 

// Added for testing 
int main() 
{ 
    printf("Menu item '%s'\n", menu_list[0]->item_name); 
    printf(" %d - %s\n", menu_list[0]->list[0].item_value, menu_list[0]->list[0].item_name); 
    printf(" %d - %s\n", menu_list[0]->list[1].item_value, menu_list[0]->list[1].item_name); 
    printf("Menu item '%s'\n", menu_list[1]->item_name); 
    printf(" %d - %s\n", menu_list[1]->list[0].item_value, menu_list[1]->list[0].item_name); 
    printf(" %d - %s\n", menu_list[1]->list[1].item_value, menu_list[1]->list[1].item_name); 
    return 0; 
} 

注意语法的menu_item1menu_item2初始化。

我添加了main(),所以我可以用一个普通的C编译器测试这个(因为我没有带有LCD的Arduino)。我测试的输出如下所示:

Menu Item 'Item 1' 
    0 - Selection 1 
    1 - Selection 2 
Menu Item 'Item 2' 
    3 - Selection 3 
    4 - Selection 4 

而我认为这就是您试图用数据结构实现的目标。你只需要适应你的Arduino代码,并使用这些数据结构来管理你的LCD上的菜单选择。