zheka 1 18 марта, 2006 Опубликовано 18 марта, 2006 (изменено) · Жалоба Точнее говоря, рекурсивно. Возможно ли такое? Дело в том что мне нужно создать некую структур для меню. Вот код, из которого думаю будет ясна идея: typedef struct { char *title; int type; TMenuItem submenu; } TMenuItem; TMenuItem MainMenu[]= { {"Поиск",1, Search}, {"Каналы",1, Channels}, {"Настройки",1, Options}, {"Выход",1, Exit} }; TMenuItem Channels[]= { {"Канал 0",1, xx}, {"Канал 1",1, xx}, {"Канал 2",1, xx}, {"Канал 3",1, xx} }; TMenuItem Options[]= { {"Option 1",1, xx}, {"Option 2",1, xx}, {"Option 3",1, xx}, {"Option 4",1, xx} }; Тип TMenuItem содержит в себе название пункта меню, далее зарезервированный параметр, далее подменю, вызываемое при выборе этого пункта. ОДнако такая фишка не работает. Возможно ли вложение и если нет, то как лучше организовать меню? Изменено 18 марта, 2006 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 18 марта, 2006 Опубликовано 18 марта, 2006 (изменено) · Жалоба Все правильно, только нужен маленький финт: typedef struct _TMenuItem{ char *title; int type; _TMenuItem *submenu; } TMenuItem; Изменено 18 марта, 2006 пользователем beer_warrior Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 марта, 2006 Опубликовано 18 марта, 2006 (изменено) · Жалоба Хм... пока вы писали я сделал свой вариант (кстати, ваш не работает - declaration syntax error на строках _TMenuItem *submenu; и } TMenuItem; ) Мой же вариант таков: struct TMenuItem{ char *title; int type; struct TMenuItem *submenu; } ; Компилятор не ругается. Но при создании TMenuItem MainMenu[]= { {"Поиск",1, Search}, {"Каналы",1, Channels}, {"Настройки",1, Options}, {"Выход",1, Exit} } ; Ругается на первую же строку: missing"(" Изменено 18 марта, 2006 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 18 марта, 2006 Опубликовано 18 марта, 2006 (изменено) · Жалоба Да конечно, упустил struct. char *title сделать как char title[16]. Указатель не несет в себе каких-то данных, если написано char * это просто забивка места под 1 адрес, если нужен текст делаеться массив, чье имя и равно указателю, но указатель не равен массиву. Займись серьезно указателями. Изменено 18 марта, 2006 пользователем beer_warrior Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 марта, 2006 Опубликовано 18 марта, 2006 · Жалоба Насчет трех или 4 элементов - я знаю. Но ошибка то в другом месте генерировалась... Или я не понял, что ты подразумевашеь под 4мя элементами: Channels, Exit,Options и Search? Или title,type,submenu - так их три... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 18 марта, 2006 Опубликовано 18 марта, 2006 · Жалоба Звыняюсь недосмотрел.Одним глазом смотрю, другим в свой код :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 марта, 2006 Опубликовано 18 марта, 2006 · Жалоба Так... все получилось. Теперь я вылез за пределы памяти. Global variable out of SRAM - совсем в другом месте программы.. Может стоит записать эти пункты во flash? Все- таки неизменяемые величины. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 18 марта, 2006 Опубликовано 18 марта, 2006 · Жалоба В принципе все меню надо держать во флэше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 марта, 2006 Опубликовано 18 марта, 2006 · Жалоба Записал во флеш - все работает. Еще ламерский вопросик - как определить количество элементов в TMenuItem? count кажется в С++ был - не работает... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 18 марта, 2006 Опубликовано 18 марта, 2006 · Жалоба sizeof(MainMenu[])/sizeof(TMenuItem) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 марта, 2006 Опубликовано 18 марта, 2006 (изменено) · Жалоба sizeof (MainMenu)выдает число 80 sizeof (MainMenu[]) - invalid expression Может я библиотеку какую не подключил? #include "macros.h" #include "mega8.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include "NokiaLCD.h" Одним глазом смотрю, другим в свой код Если не секрет, что конструируем? Изменено 18 марта, 2006 пользователем zheka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 18 марта, 2006 Опубликовано 18 марта, 2006 (изменено) · Жалоба Записал во флеш - все работает. Еще ламерский вопросик - как определить количество элементов в TMenuItem? count кажется в С++ был - не работает... Это вы точно подметили. Как int или как unsigned char... или рекурсивно в программе, пока submenu != NULL struct TMenuItem{ char *title; int type; int count; struct TMenuItem *submenu; } ; sizeof (MainMenu[]) - invalid expression понятно что invalid, какой же размер может быть у безразмерного массива? sizeof(TMenuItem) - размер элемента в вашем случае. Изменено 18 марта, 2006 пользователем defunct Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
WHILE 0 18 марта, 2006 Опубликовано 18 марта, 2006 · Жалоба Странно,что у тебя компилятор не ругается,насколько я помню,структура не может содержать экземпля- ры самой себя.И возможно,тебя ожидают еще одни грабли-ты определил структуру во флэш,и все эле- менты структуры будут во флэши,т.е константными и переменные к структуре ты прикрутить не сможешь(правда,может оно тебе и не надо).Если не секрет,чем ты память забил,что в килобайт не влазишь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 18 марта, 2006 Опубликовано 18 марта, 2006 · Жалоба Странно,что у тебя компилятор не ругается,насколько я помню,структура не может содержать экземпля- ры самой себя.И возможно,тебя ожидают еще одни грабли-ты определил структуру во флэш,и все эле- менты структуры будут во флэши,т.е константными и переменные к структуре ты прикрутить не сможешь(правда,может оно тебе и не надо).Если не секрет,чем ты память забил,что в килобайт не влазишь. У него структура не содержит саму себя, а сожержит только указатель фиксированного размера, который может быть "на что угодно". С технической стороны все Ок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zheka 1 18 марта, 2006 Опубликовано 18 марта, 2006 · Жалоба struct TMenuItem{ char *title; int type; int count; struct TMenuItem *submenu; } ; Я не вытерпел, так и сделал. Если не секрет,чем ты память забил,что в килобайт не влазишь. Был бы секрет, не стал бы я эдак с неделю назад выкладывать полный код. FontLookup - шрифт. Не, можно и его конечно во флеш, но писал библиотеку не я. константными и переменные к структуре ты прикрутить не сможешь Да это уже не грабли, натыкался ранее. А что касается данной структуры - я уверен - прикручивать ничего не надо будет. А вообще все получилось. Уже лазию по менюшке, как в сотовом телефоне. ПРоблема пока только одна - как лезть по дереву обратно, т.е. как определять родителя. Можно конечно решить как и в случае с количеством элементов в массиве - вручную прописывать. У него структура не содержит саму себя, а сожержит только указатель фиксированного размера, который может быть "на что угодно". Слышу иронию... Есть более рациональное решение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться