Помогите разобраться с кодом
- Войдите на сайт для отправки комментариев
Втр, 27/01/2015 - 14:32
Помогите разобраться с кодом
#include "avr/pgmspace.h" //Структура для пунктов меню typedef struct Item_s { struct Item_s const *Next; struct Item_s const *Previous; struct Item_s const *Parent; struct Item_s const *Child; uint8_t Select; const char *Label; } Item_t; //Пустой элемент меню #define NULL_ENTRY NullItem const Item_t NullItem PROGMEM = {(const Item_s *)NULL, (const Item_s *)NULL, (const Item_s *)NULL, (const Item_s *)NULL, 0, (const char *)NULL}; #define MenuItem(Name, Label, Next, Previous, Parent, Child, Select) \ extern const Item_t Next, Previous, Parent, Child; \ const Item_t PROGMEM Name = {&Next, &Previous, &Parent, &Child, (uint8_t)Select, Label} //Пункты меню Name, Label, Next, Previous, Parent, Child, Select MenuItem (Menu_1, "Settings", Menu_2, Menu_3, NULL_ENTRY, NULL_ENTRY, 0); MenuItem (Menu_2, "Settings 2", Menu_3, Menu_1, NULL_ENTRY, NULL_ENTRY, 0); MenuItem (Menu_3, "Settings 2", Menu_1, Menu_2, NULL_ENTRY, NULL_ENTRY, 0); //Переменная для текущего пункта меню const Item_t* currentItem; #define PREVIOUS ((const Item_t *)pgm_read_word(¤tItem->Previous)); #define NEXT ((const Item_t *)pgm_read_word(¤tItem->Next)); #define PARENT ((const Item_t *)pgm_read_word(¤tItem->Parent)); #define CHILD ((const Item_t *)pgm_read_word(¤tItem->Child)); void navigate(const Item_t *targetItem); // без этой строки не работает? void navigate(const Item_t *targetItem) { if (targetItem == &NULL_ENTRY){ return; } else{ currentItem = targetItem; } } void setup(){ Serial.begin(9600); currentItem = &Menu_1; Serial.print("> "); Serial.println((char *)pgm_read_word(¤tItem->Label)); delay(1000); currentItem = &Menu_2; Serial.print("> "); Serial.println((char *)pgm_read_word(¤tItem->Label)); } void loop(){ }
разобрался почти со всем за исключением функции navigate
почему на компилируется без строки
void navigate(const Item_t *targetItem);
В Си функция может быть описана как веше то тексту относительно вызова, так и ниже. Когда вы описываете функцию ниже ее вызова, то выше вызова должен быть объявлен прототип (ваша строка 33).
Пример:
или так:
Не компилируется - значит компилятор ругается как-то.
И что он говорит?
Это я понимаю
но я функцию только описал вызова пока ни где нет
если закомментить строку 33 компилятор выдает ошибку
ругается на 5 строку
Всё сейчас анализировать конечно не буду, но на первый взгляд ничего плохого не вижу.
Странно то, что у меня этот код скомпилился без ошибок.
А у вас, судя по сообщениям, компилятор почему-то не смог определить тип Item_t. Соответственно, прототип функции, где этот тип используется, он тоже проглотить не смог.
Код откуда копировали, прямо из редактора? Не ткнули ли случайно какой-нибудь лишний символ, где-нибудь в конце строки?
Проверьте, или попробуйте скопировать ещё раз, прямо с форума. Не вру, честное слово - у меня компилируется.
код в первом сообщении компилируется он не компелируется без 33 строки void navigate(const Item_t *targetItem);
вот почему без этой стрики он не компелируется я не понимаю
вот почему без этой стрики он не компелируется я не понимаю
Круто! :)
Не, я не знаю, честно.
Даже вот такой код, в две строчки, выдаёт ошибку:
Что-то они, ардуинщики, намудрили там собработкой этих .ino-файлов.
Если то же самое написать в отдельном файле .сpp - всё компилится нормально.
косяк ардуино иде
но блин обидно я на эту хрень стока времени убил
хотя и не бес пользы
кстати кому интересно идея взята вот здесь, здесь и здесь
последнее это реализация идеи в виде библиотеки для ардуино вроде не плохая но пример там ужастный также как и описание