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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> простенькая система меню... реализация c++ 
V
    Опции темы
En_t_end
Дата 29.4.2006, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 2
Всего: 20



С месяцок назад понадобилась менюшка для консоли, простенькая. Быстренько сделал, долго ей не пользовался, а сейчас вот понадобилась.
Не могу теперь баг отловить в ней(если точным быть, баг с не выводом последнего элемента)...
Может кто чужой посмотрит ?
ЗЫ последний элемент, хоть и не выводиться, но функция его вызывается.
menu_test.cpp:
Код

#include <iostream>
#include "MenuS.h"

using std::cout;
using std::cin;
using std::endl;

static char u;

void f0()
{
    cout << "hello from f0" << endl;
    cin >> u;
}
void f1()
{
    cout << "hello from f1" << endl;
    cin >> u;
}
void f2()
{
    cout << "hello from f2" << endl;
    cin >> u;
}
void f3()
{
    cout << "hello from f3" << endl;
    cin >> u;
}
void f4()
{
    cout << "hello from f4" << endl;
    cin >> u;
}

void main()
{
    char logo_main[] = "main menu:\n";
    char *contents[4];
    ObjMenu *members = new ObjMenu[4];
    for(unsigned int i=0;i<4;i++)
    {
                  char temp[30];
        contents[i]=new char[50];
        strcpy(contents[i],"element");
        strcat(contents[i],itoa(i,temp,10));
        members[i].SetContent(contents[i]);
    }
    members[0].SetCaseMenuFunction(f0);
    members[1].SetCaseMenuFunction(f1);
    members[2].SetCaseMenuFunction(f2);
    members[3].SetCaseMenuFunction(f3);
    members[4].SetCaseMenuFunction(f4);
    MenuS menuMain(members,4,logo_main);
    while(true)
    {
    menuMain.Out();
    menuMain.Get();
    menuMain.Clean();
    }
}


MenuS.h:
Код

#include <iostream>

typedef void (*CASE_MENU)(void);

using std::cout;
using std::cin;
using std::endl;

class ObjMenu
{
public:
    ObjMenu(CASE_MENU case_menu_func,char *content):
      pfunc(case_menu_func), str(content){};
      ObjMenu(): pfunc(NULL), str(NULL){};
    inline void SetCaseMenuFunction(CASE_MENU case_menu_func){pfunc=case_menu_func;};
    inline void CallFunction()const{pfunc();};
    inline char *GetContent()const{return str;};
    inline void SetContent(char *content){str=content;};
protected:
    char *str;//point on NULL-terminate string.Contents.
    CASE_MENU pfunc;
};

class MenuS
{
public:
    MenuS(ObjMenu *objects,const unsigned long count,
        char *name)
        :objs(objects),str(name),cnt(count){};
    MenuS():objs(NULL),str(NULL),cnt(0){};
    inline void SetObjects(ObjMenu *objects, unsigned long count);
    inline void SetPreviousMenu(MenuS *MenuLast);
    inline void SetName(char *name);
    inline void Out()
    {
        cout << str << ':' << endl;
        for(unsigned long i=0;i<cnt;i++)
            cout << i << '>' << objs[i].GetContent() << endl;
    };
    inline void Get()
    {
        unsigned long i=0;
        do
        {
            cout << "select:";
            cin.clear();
            cin >> i;
        }while(i > cnt);
        objs[i].CallFunction();
    };
    inline void Clean(){system("cls");};
protected:
    char *str;//point on NULL-terminate string.Menu name.
    unsigned long cnt;
    ObjMenu *objs;
};
 
PM MAIL ICQ Skype GTalk Jabber   Вверх
Fin
Дата 29.4.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


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

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



Код

ObjMenu *members = new ObjMenu[4];
    for(unsigned int i=0;i<4;i++)
    {
                  char temp[30];
        contents[i]=new char[50];
        strcpy(contents[i],"element");
        strcat(contents[i],itoa(i,temp,10));
        members[i].SetContent(contents[i]);
    }
    members[0].SetCaseMenuFunction(f0);
    members[1].SetCaseMenuFunction(f1);
    members[2].SetCaseMenuFunction(f2);
    members[3].SetCaseMenuFunction(f3);
    members[4].SetCaseMenuFunction(f4);

Если данный код работает. То ты создаеш массив из 4 элементов. Пытаешся обратится к массиву из 5 элементов.  


--------------------
Пролетал мимо.
PM MAIL   Вверх
En_t_end
Дата 30.4.2006, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 2
Всего: 20



Fin
Да, спасибо, видимо совсем я затупел... 
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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