Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> undefined symbol 
:(
    Опции темы
=Женек=
Дата 21.3.2006, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Это работает:
Код

layer_items=(sizeof (MainMenu) / sizeof (MainMenu[0]));


А вот это не работает:

Код

TMenuItem __flash *current_point;
current_point=MainMenu;
layer_items=(sizeof (current_point) / sizeof (current_point[0]));

PM MAIL   Вверх
srd
Дата 21.3.2006, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата(=Женек= @ 21.3.2006, 23:12 Найти цитируемый пост)

Код

TMenuItem __flash *current_point;
current_point=MainMenu;
layer_items=(sizeof (current_point) / sizeof (current_point[0]));


А это и не должно работать. sizeof (MainMenu) - это размер массива, а sizeof (curren_point) - это размер указателя, а не массива. Кажется, я это писал выше по теме.




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
=Женек=
Дата 21.3.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Да, писал... Я это понял. Я это к тому что формула приведенная не подходит...
PM MAIL   Вверх
=Женек=
Дата 21.3.2006, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Srd, если не сложно, помогите советом. ПРилагаю код (функции вырезал, дабы проще было разобраться).

Как бы вы решили задачу определения количества пунктов меню при заходе в дочернее подменю, и, самое главное - при возвращении в родительское

меню. Комментарии прилагаются

Заранее благодарен.

Код



// ИНИЦИАЛИЗАЦИЯ ПУНКТОВ МЕНЮ

typedef __flash struct _TMenuItem
    {
        char title[16];
        int type;   
        int count;             
        __flash struct _TMenuItem *parent;
        __flash struct _TMenuItem *submenu;
    } TMenuItem;

extern TMenuItem __flash MainMenu[];
extern TMenuItem __flash Search[];
extern TMenuItem __flash Options[];
extern TMenuItem __flash Channels[];

TMenuItem __flash Search[]=
             {
               {"Начать",  1, 0, MainMenu, NULL},
               {"Кончить", 1, 0, MainMenu, NULL},
               {"Выйти",   1, 0, MainMenu, NULL},
               {"", 0, 0, NULL , NULL}                              
             } ;

TMenuItem __flash Sub1[]=
             {
               {"Sub1 A", 1, 0, Options, NULL},
               {"Sub1 B", 1, 0, Options, NULL},
               {"Sub1 C", 1, 0, Options, NULL},
               {"Sub1 D", 1, 0, Options, NULL},
               {"Sub1 E", 1, 0, Options, NULL},
               {"", 0, 0, NULL , NULL}                                                            
             } ;

TMenuItem __flash Sub2[]=
             {
               {"Sub2 A", 1, 0, Options, NULL},
               {"Sub2 B", 1, 0, Options, NULL},
               {"Sub2 C", 1, 0, Options, NULL},
               {"", 0, 0, NULL , NULL}                              
             } ;

TMenuItem __flash Sub3[]=
             {
               {"Sub3 A", 1, 0, Options, NULL},
               {"Sub3 B", 1, 0, Options, NULL},
               {"Sub3 C", 1, 0, Options, NULL},
               {"", 0, 0, NULL , NULL}                              
             } ;

  
TMenuItem __flash Options[]=
             {
               {"Option 1", 1, 5, MainMenu, Sub1},
               {"Option 2", 1, 3, MainMenu, Sub2},
               {"Option 3", 1, 3, MainMenu, Sub3},
               {"", 0, 0, NULL , NULL}                              
             } ;

TMenuItem __flash Channels[]=
             {
               {"Channel 1", 1, 0, MainMenu, NULL},
               {"Channel 2", 1, 0, MainMenu, NULL},
               {"Channel 3", 1, 0, MainMenu, NULL},
               {"", 0, 0, NULL , NULL}                              
             } ;

            

TMenuItem __flash MainMenu[]=
             {
               {"Поиск", 1,  3, NULL , Search},
               {"Каналы", 1, 3, NULL , Channels},
               {"Настройки", 1, 3, NULL , Options},
               {"", 0, 0, NULL , NULL}               
             } ;


////////////////////////////////////////////////////////////////////////////////////  

void EnterMenuItem(TMenuItem __flash *point_to_menu, int count)
{
 int i,j=0;
 char *s=r; 
 LcdClear();  
 
 for (i=0;i<count;i++)
  {
   LcdGotoXY(2,i+1);
    sprintf(s,"%p", point_to_menu[i].title);
    LcdStr(FONT_1X, s, NORMAL);  
  }

  

 LcdSelect(0);
 LcdUpdate();
}



void main ()
{
int i, selection_pos, layer_items;
char *s=r; 
TMenuItem __flash *current_point;

LcdInit();
Delay();

DDRD=0x00;
PORTD=0xFF;
LcdInit();
Delay();   

current_point=MainMenu;
selection_pos=0;  
layer_items=3;
EnterMenuItem(current_point,layer_items);

LcdUpdate();     
for(;;)
{

   if (!PIND.0)     // Нажата клавиша "вниз"
     {
      if (selection_pos>layer_items) continue;
        LcdSelect(selection_pos);
        selection_pos++;         
        LcdSelect(selection_pos);      

     }
  
   if (!PIND.1)                // Нажата клавиша "верх" 
     {
      if (selection_pos==0) continue;
      LcdSelect(selection_pos);
      selection_pos--;         
      LcdSelect(selection_pos);      
    }

   if (!PIND.2)                // Нажата клавиша "Enter" (вход в подменю)
     {
        if (current_point[selection_pos].submenu==NULL) continue;
           layer_items=current_point[selection_pos].count;                                                  
           current_point=current_point[selection_pos].submenu;
           EnterMenuItem(current_point,layer_items);
           selection_pos=0;       
    }

   if (!PIND.3)                 // Нажата клавиша выхода в родительское меню) 
     {
        if (current_point[selection_pos].parent==NULL) continue;
          current_point=current_point[selection_pos].parent;
          layer_items=current_point[selection_pos].count;                                                  
          EnterMenuItem(current_point, layer_items);
          selection_pos=0;       

    }

   LcdUpdate();

}

}
/*--------------------------------------------------------------------------------------------------
                                         End of file.
--------------------------------------------------------------------------------------------------*/


PM MAIL   Вверх
srd
Дата 21.3.2006, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Насколько я понял, требуется что-то вроде такого (здесь просто иллюстрация, написанная в таком виде, чтобы его можно было быстро скомпилировать и посмотреть):
Код

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

struct Menu;

/* Каждый пункт меню имеет текст, тип(?) и указатель на подменю */
struct MenuItem
{
    char text[16];
    int type;
    struct Menu *submenu;
};

/* Меню имеет укатель на массив пунктов, количество пунктов и указатель на родительское меню */
struct Menu
{
    struct MenuItem *items;
    int item_count;
    struct Menu *parent;
};

extern struct Menu main_menu;

struct MenuItem search_items[] =
{
    {"Start", 1, NULL},
    {"Finish", 1, NULL},
    {"Quit", 1, NULL}
};
struct Menu search_menu = {search_items, sizeof search_items / sizeof search_items[0], &main_menu};

struct MenuItem channels_items[] =
{
    {"Channel 1", 1, NULL},
    {"Channel 2", 1, NULL},
    {"Channel 3", 1, NULL}
};
struct Menu channels_menu = {channels_items, sizeof channels_items / sizeof channels_items[0], &main_menu};

struct MenuItem options_items[] =
{
    {"Option 1", 1, NULL},
    {"Option 2", 1, NULL},
    {"Option 3", 1, NULL}
};
struct Menu options_menu = {options_items, sizeof options_items / sizeof options_items[0], &main_menu};

struct MenuItem main_items[] =
{
    {"Search", 1, &search_menu},
    {"Channels", 1, &channels_menu},
    {"Options", 1, &options_menu}
};
struct Menu main_menu = {main_items, sizeof main_items / sizeof main_items[0], NULL};

int main()
{
    struct Menu *current_menu = &main_menu;
    int i;
    int selected;

    for (;;)
    {
        /* выводим меню на экран */

        printf("=====================\n");
        for (i = 0; i < current_menu->item_count; ++i)
        {
            printf("Menu text == \"%s\", menu type == %d\n",
                current_menu->items[i].text,
                current_menu->items[i].type);
        }
        printf("=====================\n\n");

        // читаем введённый номер
        selected = _getch() - (int)'0' - 1;

        if (selected < 0 || current_menu->item_count <= selected)
        {
            printf("Invalid menu item number\n");

            /* Если указан ошибочный пункт, то возвращаемся в родительское меню */

            if (current_menu->parent != NULL)
                current_menu = current_menu->parent;
            else
            {
                /* Если нет родительского меню, то выходим */
                break;
            }
        }
        else
        {
            if (current_menu->items[selected].submenu != NULL)
            {
                /* Если у выбранного пункта есть подменю, то переходим в него */
                current_menu = current_menu->items[selected].submenu;
            }
            else
            {
                /* Иначе просто печатаем выбранный пункт */
                printf("Selected == \"%s\"\n", current_menu->items[selected].text);
            }
        }
    }

    return 0;
}

Возможно, кто-то предложит вариант лучше.


--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
=Женек=
Дата 21.3.2006, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 548
Регистрация: 20.2.2005

Репутация: нет
Всего: 1



Спасибо за пример, он интересен, но...
Я конечно плохо знаю С, но все же имею представлени о том, что такое программирование вообще.

Нерационально хранить отдельно информацию о количестве элементов массива, если у нас есть сам массив. Да, можно конечно передавать это количество в функуию и программа будет работать, но это извращение. Любая программа должна быть самодостаточна.

Так вот, если у нас есть массив, то даже если нет функции, которая считает элементы, можно их вручную посчитать.
Однако тут ни один вариант не прокатил...


Мне все же непонятно - даже если мы работаем с указателями - вот так:

sprintf(s,"%p", point_to_menu[i].title);

то неужели нельзя определить существует ли point_to_menu[i].title для данного i?
Внутри вышеописанной функции EnterMenuItem это работало - через !=Null.

Когда же я определил current_point в теле главной функции - проверка на NULL не срабатывает...

PM MAIL   Вверх
srd
Дата 21.3.2006, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нереварин
**


Профиль
Группа: Участник Клуба
Сообщений: 951
Регистрация: 30.8.2003
Где: Владивосток

Репутация: 27
Всего: 49



Цитата(=Женек= @ 22.3.2006, 01:55 Найти цитируемый пост)
Нерационально хранить отдельно информацию о количестве элементов массива, если у нас есть сам массив. Да, можно конечно передавать это количество в функуию и программа будет работать, но это извращение. Любая программа должна быть самодостаточна.

Да без проблем, но только никакой экономии тут нет. Проще хранить количесво элементов, чем каждый раз его считать.
Код

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

struct Menu;

/* Каждый пункт меню имеет текст, тип(?) и указатель на подменю */
struct MenuItem
{
    const char *text;
    int type;
    struct Menu *submenu;
};

/* Меню имеет укатель на массив пунктов, количество пунктов и указатель на родительское меню */
struct Menu
{
    struct MenuItem *items;
    struct Menu *parent;
};

extern struct Menu main_menu;

struct MenuItem search_items[] =
{
    {"Start", 1, NULL},
    {"Finish", 1, NULL},
    {"Quit", 1, NULL},
    {NULL, 0, NULL}
};
struct Menu search_menu = {search_items, &main_menu};

struct MenuItem channels_items[] =
{
    {"Channel 1", 1, NULL},
    {"Channel 2", 1, NULL},
    {"Channel 3", 1, NULL},
    {NULL, 0, NULL}
};
struct Menu channels_menu = {channels_items, &main_menu};

struct MenuItem options_items[] =
{
    {"Option 1", 1, NULL},
    {"Option 2", 1, NULL},
    {"Option 3", 1, NULL},
    {NULL, 0, NULL}
};
struct Menu options_menu = {options_items, &main_menu};

struct MenuItem main_items[] =
{
    {"Search", 1, &search_menu},
    {"Channels", 1, &channels_menu},
    {"Options", 1, &options_menu},
    {NULL, 0, NULL}
};
struct Menu main_menu = {main_items, NULL};

struct MenuItem *get_menu_item(struct Menu *menu, int index)
{
    struct MenuItem *item = menu->items;
    int i = 0;

    while (item->text != NULL)
    {
        if (index == i)
            return item;
        ++item;
        ++i;
    }

    return NULL;
}

int main()
{
    struct Menu *current_menu = &main_menu;
    struct MenuItem *item;
    int selected;

    for (;;)
    {
        /* выводим меню на экран */

        printf("=====================\n");
        for (item = current_menu->items; item->text != NULL; ++item)
        {
            printf("Menu text == \"%s\", menu type == %d\n",
                item->text,
                item->type);
        }
        printf("=====================\n\n");

        // читаем введённый номер
        selected = _getch() - (int)'0' - 1;
        item  = get_menu_item(current_menu, selected);

        if (item == NULL)
        {
            printf("Invalid menu item number\n");

            /* Если указан ошибочный пункт, то возвращаемся в родительское меню */

            if (current_menu->parent != NULL)
                current_menu = current_menu->parent;
            else
            {
                /* Если нет родительского меню, то выходим */
                break;
            }
        }
        else
        {
            if (item->submenu != NULL)
            {
                /* Если у выбранного пункта есть подменю, то переходим в него */
                current_menu = item->submenu;
            }
            else
            {
                /* Иначе просто печатаем выбранный пункт */
                printf("Selected == \"%s\"\n", item->text);
            }
        }
    }

    return 0;
}




--------------------
Не смей читать мою подпись!!!
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.