alexdos 0 13 августа, 2013 Опубликовано 13 августа, 2013 (изменено) · Жалоба Вот подсмотрел пример организации меню. http://easyelectronics.ru/organizaciya-dre...nogo-menyu.html Пробую для STM32 , на IAR. // структура для меню typedef struct PROGMEM{ void *Next; void *Previous; void *Parent; void *Child; uint8_t Select; const char Text[]; } menuItem; #define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \ menuItem Next; \ menuItem Previous; \ menuItem Parent; \ menuItem Child; \ menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, { Text }} #define NULL_ENTRY Null_Menu menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, {0x00}}; enum { MENU_CANCEL=1, MENU_RESET, MENU_MODE1, MENU_MODE2, MENU_MODE3, MENU_SENS1, MENU_SENS2, }; // NEXT, PREVIOUS PARENT, CHILD MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск"); и вот на строки menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, {0x00}}; MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск"); IAR выдаёт ошибку. Error[Pe146]: too many initializer values Что ему не нравится ? Изменено 13 августа, 2013 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 августа, 2013 Опубликовано 13 августа, 2013 · Жалоба все не правильно сказал.... а если "Запуск" заменить на 'З' а потом на {'З','а', 'п', 'у', 'с', 'к'} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdos 0 13 августа, 2013 Опубликовано 13 августа, 2013 · Жалоба все не правильно сказал.... а если "Запуск" заменить на 'З' а потом на {'З','а', 'п', 'у', 'с', 'к'} Ничего не меняется. по прежнему выдаёт ошибки на эти 2 строки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 13 августа, 2013 Опубликовано 13 августа, 2013 · Жалоба Ничего не меняется. по прежнему выдаёт ошибки на эти 2 строки. У вас структура menuItem имеет 6 полей , а в строчке MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск"); 7 параметров. too many initializer values - слишком много инициализирующих значений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdos 0 13 августа, 2013 Опубликовано 13 августа, 2013 · Жалоба У вас структура menuItem имеет 6 полей , а в строчке MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск"); 7 параметров. too many initializer values - слишком много инициализирующих значений. На строку: MAKE_MENU(m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, {'s'}); Выскакивает ошибка: Error[Pe054]: too few arguments in invocation of macro "MAKE_MENU" не хватает ему аргументов. Убираю в дефайне Name, #define MAKE_MENU(Next, Previous, Parent, Child, Select, Text) опять выскакивает ошибка Error[Pe146]: too many initializer values Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
massa 0 13 августа, 2013 Опубликовано 13 августа, 2013 · Жалоба Уберите кириллицу. Замените её HEX-кодами. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 13 августа, 2013 Опубликовано 13 августа, 2013 · Жалоба Попробуйте перебить макрос вот так: #define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \ menuItem Next; \ menuItem Previous; \ menuItem Parent; \ menuItem Child; \ menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, Text} Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdos 0 13 августа, 2013 Опубликовано 13 августа, 2013 (изменено) · Жалоба Попробуйте перебить макрос вот так: #define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \ menuItem Next; \ menuItem Previous; \ menuItem Parent; \ menuItem Child; \ menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, Text} Перебивка не помогла. Кириллицу менял на латинницу. Не помогло. Может подскажите ссылки на другие примеры организации многоуровневых меню Изменено 13 августа, 2013 пользователем alexdos Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrewlekar 0 13 августа, 2013 Опубликовано 13 августа, 2013 (изменено) · Жалоба У меня со скрипом, но собралось (в вижуал студии). Верните в макрос extern как в примере. Все ссылки на другие меню Next, Previous должны быть описаны с помощью MAKE_MENU иначе линкер будет ругаться. Вот как у меня получилось: #define MAKE_MENU(Name, Next, Previous, Parent, Child, Select, Text) \ extern menuItem Next; \ extern menuItem Previous; \ extern menuItem Parent; \ extern menuItem Child; \ menuItem Name = {(void*)&Next, (void*)&Previous, (void*)&Parent, (void*)&Child, (uint8_t)Select, { Text }} menuItem Null_Menu = {(void*)0, (void*)0, (void*)0, (void*)0, 0, {0x00}}; #define NULL_ENTRY Null_Menu enum { MENU_CANCEL=1, MENU_RESET, MENU_MODE1, MENU_MODE2, MENU_MODE3, MENU_SENS1, MENU_SENS2, }; MAKE_MENU(Level1Item1, Level1Item2, Level1Item3, NULL_ENTRY, Level1Item1Sub1, 0, "Запуск"); MAKE_MENU(Level1Item2, Level1Item3, Level1Item1, NULL_ENTRY, NULL_ENTRY, 0, "Запуск2"); MAKE_MENU(Level1Item3, Level1Item1, Level1Item2, NULL_ENTRY, NULL_ENTRY, 0, "Запуск3"); MAKE_MENU(Level1Item1Sub1, NULL_ENTRY, NULL_ENTRY, Level1Item1, NULL_ENTRY, 0, "Запуск4"); int _tmain(int argc, _TCHAR* argv[]) { return 0; } Изменено 13 августа, 2013 пользователем andrewlekar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 13 августа, 2013 Опубликовано 13 августа, 2013 · Жалоба У вас структура menuItem имеет 6 полей , а в строчке MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск"); 7 параметров. too many initializer values - слишком много инициализирующих значений. тоже сначала так подумал, нет там по макросу все верно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdos 0 13 августа, 2013 Опубликовано 13 августа, 2013 · Жалоба Мда... пол дня убил.. а оказалось все просто.. const char Text[17]; нужно было указать размерность текстового поля... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 14 августа, 2013 Опубликовано 14 августа, 2013 · Жалоба это слишком простое и очевидное решение. Для маленьких массивов у вас будут лишние байты, а для больших не хватит места. Думал надо решить задачу в общем виде как было в исходнике... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lotor 0 14 августа, 2013 Опубликовано 14 августа, 2013 · Жалоба Может подскажите ссылки на другие примеры организации многоуровневых меню Поиском по форуму надо-таки учиться пользоваться... Например посмотрите тут Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexdos 0 14 августа, 2013 Опубликовано 14 августа, 2013 · Жалоба это слишком простое и очевидное решение. Для маленьких массивов у вас будут лишние байты, а для больших не хватит места. Думал надо решить задачу в общем виде как было в исходнике... Отображение будет на 2-х строчном дисплее, поэтому 16 символов в строке, в самый раз, чтоб одним махом при выводе стереть и старое что было. А что место, щас уже прошли времена борьбы за каждый байт. Не хватит, возьмём "жирней" камешок, на пару копеек дороже. Согласен с Вами что нужно решить задачу в общем виде, но пока и малым обойдусь, как всегда время поджимает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться