|
Вложенное определение типов |
|
|
|
Mar 18 2006, 16:11
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Точнее говоря, рекурсивно. Возможно ли такое? Дело в том что мне нужно создать некую структур для меню. Вот код, из которого думаю будет ясна идея: Код 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 содержит в себе название пункта меню, далее зарезервированный параметр, далее подменю, вызываемое при выборе этого пункта. ОДнако такая фишка не работает. Возможно ли вложение и если нет, то как лучше организовать меню?
Сообщение отредактировал zheka - Mar 18 2006, 16:17
|
|
|
|
|
Mar 18 2006, 16:56
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Хм... пока вы писали я сделал свой вариант (кстати, ваш не работает - 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"("
Сообщение отредактировал zheka - Mar 18 2006, 16:58
|
|
|
|
|
Mar 18 2006, 17:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380

|
Да конечно, упустил struct. char *title сделать как char title[16]. Указатель не несет в себе каких-то данных, если написано char * это просто забивка места под 1 адрес, если нужен текст делаеться массив, чье имя и равно указателю, но указатель не равен массиву. Займись серьезно указателями.
Сообщение отредактировал beer_warrior - Mar 18 2006, 17:11
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 18 2006, 18:13
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
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" Цитата Одним глазом смотрю, другим в свой код Если не секрет, что конструируем?
Сообщение отредактировал zheka - Mar 18 2006, 18:10
|
|
|
|
|
Mar 18 2006, 19:03
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(zheka @ Mar 18 2006, 19:55)  Записал во флеш - все работает. Еще ламерский вопросик - как определить количество элементов в 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) - размер элемента в вашем случае.
Сообщение отредактировал defunct - Mar 18 2006, 19:06
|
|
|
|
|
Mar 18 2006, 19:03
|

Знающий
   
Группа: Свой
Сообщений: 902
Регистрация: 2-01-06
Из: Краснодар
Пользователь №: 12 768

|
Странно,что у тебя компилятор не ругается,насколько я помню,структура не может содержать экземпля- ры самой себя.И возможно,тебя ожидают еще одни грабли-ты определил структуру во флэш,и все эле- менты структуры будут во флэши,т.е константными и переменные к структуре ты прикрутить не сможешь(правда,может оно тебе и не надо).Если не секрет,чем ты память забил,что в килобайт не влазишь.
--------------------
"Hello, word!" - 17 errors 56 warnings
|
|
|
|
|
Mar 18 2006, 19:08
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(WHALE @ Mar 18 2006, 21:03)  Странно,что у тебя компилятор не ругается,насколько я помню,структура не может содержать экземпля- ры самой себя.И возможно,тебя ожидают еще одни грабли-ты определил структуру во флэш,и все эле- менты структуры будут во флэши,т.е константными и переменные к структуре ты прикрутить не сможешь(правда,может оно тебе и не надо).Если не секрет,чем ты память забил,что в килобайт не влазишь. У него структура не содержит саму себя, а сожержит только указатель фиксированного размера, который может быть "на что угодно". С технической стороны все Ок.
|
|
|
|
|
Mar 18 2006, 19:49
|
Гуру
     
Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164

|
Цитата struct TMenuItem{ char *title; int type; int count; struct TMenuItem *submenu; } ; Я не вытерпел, так и сделал. Цитата Если не секрет,чем ты память забил,что в килобайт не влазишь. Был бы секрет, не стал бы я эдак с неделю назад выкладывать полный код. FontLookup - шрифт. Не, можно и его конечно во флеш, но писал библиотеку не я. Цитата константными и переменные к структуре ты прикрутить не сможешь Да это уже не грабли, натыкался ранее. А что касается данной структуры - я уверен - прикручивать ничего не надо будет. А вообще все получилось. Уже лазию по менюшке, как в сотовом телефоне. ПРоблема пока только одна - как лезть по дереву обратно, т.е. как определять родителя. Можно конечно решить как и в случае с количеством элементов в массиве - вручную прописывать. Цитата У него структура не содержит саму себя, а сожержит только указатель фиксированного размера, который может быть "на что угодно". Слышу иронию... Есть более рациональное решение?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|