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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Борланд, ссылки, не ссылки, разный результат у разных компиляторов 
:(
    Опции темы
Mayk
Дата 20.5.2006, 18:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



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


(суть следуещего кода такова: у нас есть менюшка, есть класс хандлер, который определяет что какой именнно метод из менюшки стоит вызвать по какой клавише, но в данном тесте описание и клавиши нужны, так как без них тест СРАБАТЫВАЕТ)

(код немного упрощён)
Код

#include <iostream>
#include <string>
class Menu 
{
    public:
    struct Handler{
        typedef int (Menu::*memfun_t)();
//        Handler(int key_, const string& desc_, const memfun_t& func_) //1
        Handler(int key_, const string& desc_, memfun_t func_) //2
            : key(key_), desc(desc_), function(func_)
        {}

        char key;
        string desc;
        memfun_t function;
    };
    int test(){
        cout << "test started\n";
        for(const Handler* h = getHandlers(); h->key; ++h){
            if( h->function == &Menu::exit ){ //3
                cout << "function = test\n";
            } else {
                cout << "!!! function != test\n"; 
            }
        }
        return 0;
    }

    int exit(){
        return -1;
    }
    static const Handler* getHandlers()  {
        static Handler handlers[] =
        {
            Handler('a', "desc1", &Menu::exit), //4
            Handler('b', "desc2", &Menu::exit), //5
            Handler(0,"",0)
        };
        return &handlers[0];
    };
};

int main(){
    Menu menu;
    menu.test();
}


если скомпилить в free borland C++ compiler, то получается странный результат.
  • Проверка в //3 показывает, что ни handlers[0].function(//4), ни handlers[1].function(//5) не ссылается на Menu::exit. 
  • Но стоит закоментировать //2 и раскоментировать //1, как проверки выполняются успешно.
  • Если оставить //2, но убрать Handler::desc, то не срабатывает лишь первая провера (//4), 
  • если убрать Handler::desc и поместить Handler::function пере Handler::key, то срабатывают обе проверки.

Помучав другие результаты получаем:
  • В vs2003 этот код компилируется и выполняется нормально.
  • онлайновый g++ выполнил проверки нормально
  • дигимарса не смогла осилить массив хандерлов(хотя комо показала, что код с её точки зрения легален), 
    •  если вынести код Menu::getHandlers() из объявляения класса, то обе проверки успешны

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


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 20.5.2006, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



убери конструкторы из Handler и снова попробуй, думаю это поможет. 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Mayk
Дата 20.5.2006, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(GremlinProg @  20.5.2006,  23:14 Найти цитируемый пост)
убери конструкторы из Handler и снова попробуй, думаю это поможет.  

Нельзя.

Борланд не понимает
Цитата

        static Handler handlers[] =
        {
            {'a', "desc1", &Menu::exit},
            {'b', "desc2", &Menu::exit},
            {0,"",0}
        };
.
Собственно поэтому конструктор и добавлен. 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 20.5.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 3
Всего: 106



а борланд агрегатов вообще не понимает?

Добавлено @ 22:20 
тогда попробуй еще копирующий конструктор добавить.

Добавлено @ 22:23 
хотя это скорее не выход, а причина ( 


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
MAKCim
Дата 21.5.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



странно что
Цитата

Но стоит закоментировать //2 и раскоментировать //1, как проверки выполняются успешно.

в одном случае структура, представляющая указатель на функцию, копируется, в другом передается по ссылке
кроме уменьшения эффективности в 1-ом случае должно быть все ОК
GremlinProg
Цитата

тогда попробуй еще копирующий конструктор добавить.

что это даст? если он тут где-то и нужен, то компилятор его сгенерирует не хуже
Цитата

# В vs2003 этот код компилируется и выполняется нормально.
# онлайновый g++ выполнил проверки нормально

может тогда (и скорее всего) дело в компиляторе 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Earnest
Дата 22.5.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(Mayk @  20.5.2006,  19:51 Найти цитируемый пост)
если убрать Handler::desc и поместить Handler::function пере Handler::key, то срабатывают обе проверки.

Согласна с MAKCimом насчет компилятора. Помню, еще в досовском борланде иногда встречались необъяснимые глюки, связанные с выравниванием или порядком элементов в структуре. Забавно, наверное, посмотреть, что там в памяти после инициализации лежит. Для эксперименту можно еще явный выравнивающий char после key добавить. 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0521 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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