2015-02-08 2 views
-1

Я нахожусь в меню для 16x2 ЖК-дисплея для небольшого проекта arduino. Я почти закончил, но я не понимаю последнюю небольшую проблему.Ошибка компиляции Arduino при использовании ссылки на структуру в другой структуре

В следующем (упрощенный) код создает проблему:

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.

Я не понимаю сообщение об ошибке. Что здесь не так?

+0

Ошибка довольно ясна. '& sel_list' является указателем на массив или' Select_Item * (*) [2] '. В то время как 'Menu_Item :: list' является указателем-' -Select_Item' или 'Select_Item *'. –

+0

Не могли бы вы предложить компилируемую альтернативу? –

+0

Это действительно неясно, что вы пытаетесь сделать ... –

ответ

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_item1 и menu_item2.

Я добавил main(), чтобы проверить это с помощью обычного компилятора C (поскольку у меня нет Arduino с ЖК-дисплеем). Вывод из моего тестирования выглядит следующим образом:

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

И я думаю, что это то, что вы пытаетесь достичь с помощью структур данных. Вам просто нужно будет адаптировать это к вашему коде Arduino и использовать эти структуры данных для управления выбором меню на вашем ЖК-дисплее.