Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как создать вложенные структуры меню с параметрами


Автор: dencraft 17.8.2007, 01:07
Меню должно отображаться на двухстрочном цифробуквенном индикаторе. Хотелось бы что-то в роде иерархии пунктов меню.
Код
Например:
MenuItem1:
   Параметр 1
   Параметр 2
MenuItem2:
   MenuItem2.1:
      Параметр 3 (диапазн 1..100, def=50)
      Параметр 4
   MenuItem2.2:
      Параметр 5
      Параметр 6
MenuItem3:
и т.п.

Так вот как лучше объеденить эти текстовые наименования с параметрами. Как организовать правильно это все в структуре. 
Также желательно иметь независимые настройки для каждого пункта меню (мин, макс знач., знач по умолч. и т.п.);
Пишу все это под специфическое железо, в котором нужно меню для задания конфигурации.
Буду рад любым вариантам реализации. Или хотя бы ткните носом в каком направлении искать.

Автор: bsa 17.8.2007, 09:53
Код
struct MenuItem {
      const struct MenuItem *next, *prev;        //указатели на следующий и предыдущий пункты текущего меню.
      const struct MenuItem *subMenuFirstItem;   //указатель на первый элемент вложенного меню
      const char *name;     //название параметра
      int min, max, def;//комментарии не нужны
      int *data;         //указатель на переменную-параметр
};
Думаю, что дальше делать сам догадаешься.

Автор: chipset 18.8.2007, 01:20
Ещё есть довольно велосипедный вариант.

Код

struct menu_item
{
char* name;
int hierarchy_index; 
} menuArray[10];


Я знаю так делают в JS, но вроде это будет побыстрее чем реализовывать обход дерева.

Добавлено через 55 секунд
Особенно для контроллера.

Автор: bsa 18.8.2007, 07:18
вообще-то в моем случае обход дерева делать не надо. Где ж ты видел, чтобы доступ к пунктам меню происходил в случайном порядке?

Автор: dencraft 19.8.2007, 13:25
Цитата(bsa @ 17.8.2007,  09:53)
Код
struct MenuItem {
      const struct MenuItem *next, *prev;        //указатели на следующий и предыдущий пункты текущего меню.
      const struct MenuItem *subMenuFirstItem;   //указатель на первый элемент вложенного меню
      const char *name;     //название параметра
      int min, max, def;//комментарии не нужны
      int *data;         //указатель на переменную-параметр
};
Думаю, что дальше делать сам догадаешься.

Ну хорошо. Тогда еще один совсем глупый вопрос.

вот следующий код:

Код

...
typedef struct TMenuItem
{
   struct TMenuItem *next, *prev;
   struct TMenuItem *subFirstMenuItem;
   char *Name;
   int min, max, def;
   int *data;
};
...
              //               Prev        Next       Root         Name Menu      Min   Max    Def    Value
struct TMenuItem MainMenu0={0         , &MainMenu1, 0         , "FirstItemMenu1", 0   , 20   , 10,  &State1};
struct TMenuItem MainMenu1={&MainMenu0, &MainMenu2, 0         , "FirstItemMenu2", -10 , 20   , 10,  &State2};
struct TMenuItem MainMenu2={&MainMenu1, 0         , 0         , "FirstItemMenu3", 0   , 50   , 10,  &State3};
...



Однако не компилируется по причине того, что компилятор еще не знает о MainMenu1, т.к. в этот момент он еще не объявлен. Как быть. 

Автор: bsa 19.8.2007, 14:42
попробуй так:
Код
....
extern struct TMenuItem MainMenu1;
extern struct TMenuItem MainMenu2;
struct TMenuItem MainMenu0={0         , &MainMenu1, 0         , "FirstItemMenu1", 0   , 20   , 10,  &State1};
struct TMenuItem MainMenu1={&MainMenu0, &MainMenu2, 0         , "FirstItemMenu2", -10 , 20   , 10,  &State2};
struct TMenuItem MainMenu2={&MainMenu1, 0         , 0         , "FirstItemMenu3", 0   , 50   , 10,  &State3};

Хотя, я вообще-то подразумевал, что будет делаться так:
Код

const struct TMenuItem MainMenu[] = {
    {0         , MainMenu+1, 0         , "FirstItemMenu1", 0   , 20   , 10,  &State1},
    {MainMenu+0, MainMenu+2, 0         , "FirstItemMenu2", -10 , 20   , 10,  &State2},
    {MainMenu+1, 0         , 0         , "FirstItemMenu3", 0   , 50   , 10,  &State3}
};

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)