Помогите разобраться с кодом

2009Shef
Offline
Зарегистрирован: 23.10.2014

Помогите разобраться с кодом

#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(&currentItem->Previous));
#define NEXT     ((const Item_t *)pgm_read_word(&currentItem->Next));
#define PARENT   ((const Item_t *)pgm_read_word(&currentItem->Parent));
#define CHILD    ((const Item_t *)pgm_read_word(&currentItem->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(&currentItem->Label));
    delay(1000);
    currentItem = &Menu_2;
    Serial.print("> ");
    Serial.println((char *)pgm_read_word(&currentItem->Label));
}
void loop(){

}

 

разобрался почти со всем за исключением функции navigate

почему на компилируется без строки

void navigate(const Item_t *targetItem);

sva1509
Offline
Зарегистрирован: 07.12.2012

В Си функция может быть описана как веше то тексту относительно вызова, так и ниже. Когда вы описываете функцию ниже ее вызова, то выше вызова должен быть объявлен прототип (ваша строка 33).

Пример:

void foo(char *str)
{
      puts(str);
}

main()
{
      foo("Hello World !");
}

или так:

void foo(char *str);

main()
{
     foo("Hello World !");
}

void foo(char *str)
{
       puts(str);
}

 

Datak
Offline
Зарегистрирован: 09.10.2014

Не компилируется - значит компилятор ругается как-то.

И что он говорит?

2009Shef
Offline
Зарегистрирован: 23.10.2014

Это я понимаю

но я функцию только описал вызова пока ни где нет

если закомментить строку 33 компилятор выдает ошибку

ругается на 5 строку

error: expected ',' or '...' before '*' token
error: ISO C++ forbids declaration of 'Item_t' with no type

 

Datak
Offline
Зарегистрирован: 09.10.2014

Всё сейчас анализировать конечно не буду, но на первый взгляд ничего плохого не вижу.

Странно то, что у меня этот код скомпилился без ошибок.

А у вас, судя по сообщениям, компилятор почему-то не смог определить тип Item_t. Соответственно, прототип функции, где этот тип используется, он тоже проглотить не смог.

Код откуда копировали, прямо из редактора? Не ткнули ли случайно какой-нибудь лишний символ, где-нибудь в конце строки?

Проверьте, или попробуйте скопировать ещё раз, прямо с форума. Не вру, честное слово - у меня компилируется.

2009Shef
Offline
Зарегистрирован: 23.10.2014

код в первом сообщении компилируется он не компелируется без 33 строки void navigate(const Item_t *targetItem);

вот почему без этой стрики он не компелируется я не понимаю

Datak
Offline
Зарегистрирован: 09.10.2014

2009Shef пишет:

вот почему без этой стрики он не компелируется я не понимаю

Круто! :)
Не, я не знаю, честно.

Даже вот такой код, в две строчки, выдаёт ошибку:





typedef int MY_TYPE;

int Func( MY_TYPE Arg ) { }

Что-то они, ардуинщики, намудрили там  собработкой этих .ino-файлов.
Если то же самое написать в отдельном файле .сpp - всё компилится нормально.

2009Shef
Offline
Зарегистрирован: 23.10.2014

косяк ардуино иде 

но блин обидно я на эту хрень стока времени убил

хотя и не бес пользы

кстати кому интересно идея взята вот здесь, здесь и здесь

последнее это реализация идеи в виде библиотеки для ардуино вроде не плохая но пример там ужастный также как и описание