【问题标题】:Arduino compile error while using reference to a struct in another structArduino在另一个结构中使用对结构的引用时编译错误
【发布时间】:2015-02-08 18:15:50
【问题描述】:

我正在为一个小型 arduino 项目编写一个 16x2 LCD 的菜单。 快写完了,但是最后一个小问题没看懂。

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

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 };

最终出现以下错误:

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

在代码中,我从变量中访问值并将其显示在显示器中,一旦编辑,我就可以将其写回变量。只要我只有数字要显示/编辑,这不是问题。 现在为了便于使用,我想添加某种选项菜单,用户可以在其中选择选项。应该显示 item_name,而不是原始值,但当然应该在幕后使用 item_value。 这就是我引入 Select_Item 结构的原因。

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

【问题讨论】:

  • 错误很明显。 &sel_list 是指向数组的指针,或 Select_Item * (*)[2]。而Menu_Item::list 是指向Select_ItemSelect_Item * 的指针。
  • 您能推荐一个可编译的替代方案吗?
  • 真的不清楚你要做什么......
  • 我想在menu_item中有一个指向选择列表sel_list的指针。或者简而言之,我如何制作一个稍后可以在代码中访问的选项列表
  • 由于数组衰减为指向其第一个元素的指针,因此您可以使用 sel_list 而不使用地址 (&) 运算符。

标签: c++ pointers struct compiler-errors arduino


【解决方案1】:

我认为你想要做的是这样的:

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 上的菜单选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    相关资源
    最近更新 更多