реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
alexdos
сообщение Aug 13 2013, 15:31
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Вот подсмотрел пример организации меню. http://easyelectronics.ru/organizaciya-dre...nogo-menyu.html
Пробую для STM32 , на IAR.

CODE
// структура для меню
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

Что ему не нравится ?

Сообщение отредактировал IgorKossak - Aug 13 2013, 21:17
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 13 2013, 15:34
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



все не правильно сказал....

а если
"Запуск"
заменить на 'З'

а потом на
{'З','а', 'п', 'у', 'с', 'к'}
Go to the top of the page
 
+Quote Post
alexdos
сообщение Aug 13 2013, 16:33
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Цитата(Golikov A. @ Aug 13 2013, 18:34) *
все не правильно сказал....

а если
"Запуск"
заменить на 'З'

а потом на
{'З','а', 'п', 'у', 'с', 'к'}


Ничего не меняется. по прежнему выдаёт ошибки на эти 2 строки.
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 13 2013, 17:07
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(alexdos @ Aug 13 2013, 19:33) *
Ничего не меняется. по прежнему выдаёт ошибки на эти 2 строки.




У вас структура menuItem имеет 6 полей , а в строчке

Код
MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск");


7 параметров. too many initializer values - слишком много инициализирующих значений.

Go to the top of the page
 
+Quote Post
alexdos
сообщение Aug 13 2013, 17:13
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Цитата(_Артём_ @ Aug 13 2013, 20:07) *
У вас структура 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
Go to the top of the page
 
+Quote Post
V.K
сообщение Aug 13 2013, 17:17
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 453
Регистрация: 6-05-06
Из: РФ
Пользователь №: 16 841



Уберите кириллицу. Замените её HEX-кодами.
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Aug 13 2013, 17:19
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



Попробуйте перебить макрос вот так:

Код
#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}
Go to the top of the page
 
+Quote Post
alexdos
сообщение Aug 13 2013, 17:27
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Цитата(andrewlekar @ Aug 13 2013, 20:19) *
Попробуйте перебить макрос вот так:

Код
#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 - Aug 13 2013, 17:33
Go to the top of the page
 
+Quote Post
andrewlekar
сообщение Aug 13 2013, 17:53
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 837
Регистрация: 8-02-07
Пользователь №: 25 163



У меня со скрипом, но собралось (в вижуал студии).

Верните в макрос extern как в примере. Все ссылки на другие меню Next, Previous должны быть описаны с помощью MAKE_MENU иначе линкер будет ругаться.

Вот как у меня получилось:
CODE
#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;
}


Сообщение отредактировал andrewlekar - Aug 13 2013, 17:53
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 13 2013, 20:48
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(_Артём_ @ Aug 13 2013, 21:07) *
У вас структура menuItem имеет 6 полей , а в строчке

Код
MAKE_MENU(m_s1i1, m_s1i2, NULL_ENTRY, NULL_ENTRY, m_s2i1, 0, "Запуск");


7 параметров. too many initializer values - слишком много инициализирующих значений.


тоже сначала так подумал, нет там по макросу все верно.

Go to the top of the page
 
+Quote Post
alexdos
сообщение Aug 13 2013, 20:51
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Мда... пол дня убил.. а оказалось все просто..

Код
const char  Text[17];


нужно было указать размерность текстового поля...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Aug 14 2013, 03:35
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



это слишком простое и очевидное решение.
Для маленьких массивов у вас будут лишние байты, а для больших не хватит места. Думал надо решить задачу в общем виде как было в исходнике...
Go to the top of the page
 
+Quote Post
Lotor
сообщение Aug 14 2013, 07:11
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 476
Регистрация: 3-07-07
Из: Санкт-Петербург
Пользователь №: 28 866



Цитата(alexdos @ Aug 13 2013, 21:27) *
Может подскажите ссылки на другие примеры организации многоуровневых меню

Поиском по форуму надо-таки учиться пользоваться... Например посмотрите тут


--------------------
Ковырял чукча отверткой в ухе, звук в телевизоре и пропал.
Go to the top of the page
 
+Quote Post
alexdos
сообщение Aug 14 2013, 07:50
Сообщение #14


Местный
***

Группа: Участник
Сообщений: 339
Регистрация: 10-07-08
Из: Херсон
Пользователь №: 38 856



Цитата(Golikov A. @ Aug 14 2013, 06:35) *
это слишком простое и очевидное решение.
Для маленьких массивов у вас будут лишние байты, а для больших не хватит места. Думал надо решить задачу в общем виде как было в исходнике...

Отображение будет на 2-х строчном дисплее, поэтому 16 символов в строке, в самый раз, чтоб одним махом при выводе стереть и старое что было. А что место, щас уже прошли времена борьбы за каждый байт. Не хватит, возьмём "жирней" камешок, на пару копеек дороже.
Согласен с Вами что нужно решить задачу в общем виде, но пока и малым обойдусь, как всегда время поджимает.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 00:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01623 секунд с 7
ELECTRONIX ©2004-2016