Перейти к содержанию
    

Вложенное определение типов

Точнее говоря, рекурсивно. Возможно ли такое? Дело в том что мне нужно создать некую структур для меню.

 

Вот код, из которого думаю будет ясна идея:

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все правильно, только нужен маленький финт:

typedef struct _TMenuItem{

char *title;

int type;

_TMenuItem *submenu;

} TMenuItem;

Изменено пользователем beer_warrior

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм... пока вы писали я сделал свой вариант (кстати, ваш не работает - 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да конечно, упустил struct.

char *title сделать как char title[16].

Указатель не несет в себе каких-то данных, если написано char * это просто забивка места под 1 адрес,

если нужен текст делаеться массив, чье имя и равно указателю, но указатель не равен массиву.

Займись серьезно указателями.

Изменено пользователем beer_warrior

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет трех или 4 элементов - я знаю. Но ошибка то в другом месте генерировалась...

Или я не понял, что ты подразумевашеь под 4мя элементами:

Channels, Exit,Options и Search?

 

Или title,type,submenu - так их три...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так... все получилось. Теперь я вылез за пределы памяти.

Global variable out of SRAM - совсем в другом месте программы..

Может стоит записать эти пункты во flash? Все- таки неизменяемые величины.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Записал во флеш - все работает.

Еще ламерский вопросик - как определить количество элементов в TMenuItem? count кажется в С++ был - не работает...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Записал во флеш - все работает.

Еще ламерский вопросик - как определить количество элементов в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно,что у тебя компилятор не ругается,насколько я помню,структура не может содержать экземпля-

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Странно,что у тебя компилятор не ругается,насколько я помню,структура не может содержать экземпля-

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

struct TMenuItem{

char *title;

int type;

int count;

struct TMenuItem *submenu;

} ;

 

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

 

 

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

 

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

 

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

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

 

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

 

 

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

 

Слышу иронию... Есть более рациональное решение?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...