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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Вложенное определение типов
zheka
сообщение Mar 18 2006, 16:11
Сообщение #1


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 18 2006, 16:35
Сообщение #2


Профессионал
*****

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



Все правильно, только нужен маленький финт:
typedef struct _TMenuItem{
char *title;
int type;
_TMenuItem *submenu;
} TMenuItem;

Сообщение отредактировал beer_warrior - Mar 18 2006, 16:36


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 18 2006, 16:56
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 18 2006, 17:05
Сообщение #4


Профессионал
*****

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



Да конечно, упустил struct.
char *title сделать как char title[16].
Указатель не несет в себе каких-то данных, если написано char * это просто забивка места под 1 адрес,
если нужен текст делаеться массив, чье имя и равно указателю, но указатель не равен массиву.
Займись серьезно указателями.

Сообщение отредактировал beer_warrior - Mar 18 2006, 17:11


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 18 2006, 17:12
Сообщение #5


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Насчет трех или 4 элементов - я знаю. Но ошибка то в другом месте генерировалась...
Или я не понял, что ты подразумевашеь под 4мя элементами:
Channels, Exit,Options и Search?

Или title,type,submenu - так их три...
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 18 2006, 17:14
Сообщение #6


Профессионал
*****

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



Звыняюсь недосмотрел.Одним глазом смотрю, другим в свой код smile.gif


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 18 2006, 17:19
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Так... все получилось. Теперь я вылез за пределы памяти.
Global variable out of SRAM - совсем в другом месте программы..
Может стоит записать эти пункты во flash? Все- таки неизменяемые величины.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 18 2006, 17:46
Сообщение #8


Профессионал
*****

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



В принципе все меню надо держать во флэше.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 18 2006, 17:55
Сообщение #9


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Записал во флеш - все работает.
Еще ламерский вопросик - как определить количество элементов в TMenuItem? count кажется в С++ был - не работает...
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 18 2006, 18:07
Сообщение #10


Профессионал
*****

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



sizeof(MainMenu[])/sizeof(TMenuItem)


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 18 2006, 18:13
Сообщение #11


Гуру
******

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 18 2006, 19:03
Сообщение #12


кекс
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
WHALE
сообщение Mar 18 2006, 19:03
Сообщение #13


Знающий
****

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



Странно,что у тебя компилятор не ругается,насколько я помню,структура не может содержать экземпля-
ры самой себя.И возможно,тебя ожидают еще одни грабли-ты определил структуру во флэш,и все эле-
менты структуры будут во флэши,т.е константными и переменные к структуре ты прикрутить не сможешь(правда,может оно тебе и не надо).Если не секрет,чем ты память забил,что в килобайт не влазишь.


--------------------
"Hello, word!" - 17 errors 56 warnings
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 18 2006, 19:08
Сообщение #14


кекс
******

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



Цитата(WHALE @ Mar 18 2006, 21:03) *
Странно,что у тебя компилятор не ругается,насколько я помню,структура не может содержать экземпля-
ры самой себя.И возможно,тебя ожидают еще одни грабли-ты определил структуру во флэш,и все эле-
менты структуры будут во флэши,т.е константными и переменные к структуре ты прикрутить не сможешь(правда,может оно тебе и не надо).Если не секрет,чем ты память забил,что в килобайт не влазишь.

У него структура не содержит саму себя, а сожержит только указатель фиксированного размера, который может быть "на что угодно". С технической стороны все Ок.
Go to the top of the page
 
+Quote Post
zheka
сообщение Mar 18 2006, 19:49
Сообщение #15


Гуру
******

Группа: Участник
Сообщений: 2 072
Регистрация: 14-01-06
Пользователь №: 13 164



Цитата
struct TMenuItem{
char *title;
int type;
int count;
struct TMenuItem *submenu;
} ;


Я не вытерпел, так и сделал.


Цитата
Если не секрет,чем ты память забил,что в килобайт не влазишь.


Был бы секрет, не стал бы я эдак с неделю назад выкладывать полный код. FontLookup - шрифт. Не, можно и его конечно во флеш, но писал библиотеку не я.

Цитата
константными и переменные к структуре ты прикрутить не сможешь

Да это уже не грабли, натыкался ранее. А что касается данной структуры - я уверен - прикручивать ничего не надо будет.

А вообще все получилось. Уже лазию по менюшке, как в сотовом телефоне. ПРоблема пока только одна - как лезть по дереву обратно, т.е. как определять родителя. Можно конечно решить как и в случае с количеством элементов в массиве - вручную прописывать.


Цитата
У него структура не содержит саму себя, а сожержит только указатель фиксированного размера, который может быть "на что угодно".


Слышу иронию... Есть более рациональное решение?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 05:39
Рейтинг@Mail.ru


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