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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно передать указатель на функцию 
:(
    Опции темы
Riddik
Дата 27.6.2009, 05:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Туплю после бессонной ночи наверное.

Есть ф-ия, принимающая указатель на ф-ию:
Код

Term( void (*pf)() )
{
    ...
    pf();
    ...
}


Собственно, ф-ия:
Код

inline void Dest()
{
...
}


Вызов первой ф-ии:
Код

Term(Dest);


Компилятор ругается, что не может конвертировать из void(void) в void (_cdecl *)(void).

Что такое?
PM MAIL   Вверх
Andrew121
Дата 27.6.2009, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

typedef void(*func_t)();
...
void func() {
}
...
Term( func_t pf ) {
    ...
    pf();
    ...
}
...
Term(func);

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


Опытный
**


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

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



Ругается точно так же.

Этот проект я делаю на старом компиляторе vc 6.0, может в этом дело?
PM MAIL   Вверх
Andrew121
Дата 27.6.2009, 06:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

typedef void(*_cdecl func_t)();
...
void func() {
}
...
Term( func_t pf ) {
    ...
    pf();
    ...
}
...
Term(func);

Мдя...тот компилятор ваще не понятно какого стандарта придерживается smile

Добавлено через 47 секунд
Ругается он на "calling conversion". Посмотри как для него это нужно делать...

Добавлено через 1 минуту и 25 секунд
А почему такой компилятор используешь?
PM MAIL   Вверх
Andrew121
Дата 27.6.2009, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Еще так попробуй:
Код

typedef void(_cdecl *func_t)();
typedef void(__stdcall *func_t)();


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


Опытный
**


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

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



На все варианты та же ругань.

Этот компилятор использую по причине того, что давно начал на нём делать и всё устраивало на 100%, на новый переводить очень затратно по причине разной реализации STL, а именно vector, который активно используется. В новой и старой STL по-разному реализованы добавление и удаление элементов в вектор, в новой добавление или удаление элемента влечёт полное переписование всего вектора в другую область памяти, что делает некоторые указатели на его элементы недействительными, а главное, тратит значительно больше ресурсов процессора, а скорость выполнения критична для проекта.

Все эти мои выводы вполне могут оказаться бредом, поскольку изучением STL я нормально ещё не занимался, всё на ощупь. 

 
PM MAIL   Вверх
Andrew121
Дата 27.6.2009, 07:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Riddik @  27.6.2009,  07:12 Найти цитируемый пост)
Все эти мои выводы вполне могут оказаться бредом, поскольку изучением STL я нормально ещё не занимался, всё на ощупь. 

Похоже что так оно и есть....



Цитата(Riddik @  27.6.2009,  07:12 Найти цитируемый пост)
В новой и старой STL по-разному реализованы добавление и удаление элементов в вектор, в новой добавление или удаление элемента влечёт полное переписование всего вектора в другую область памяти, что делает некоторые указатели на его элементы недействительными

Абсолютная истина!
Но все вектора так и работают! Что-то ты заблуждаешься...
В теории, если в вектор добавлен элемент, то прежние итераторы, 50 на 50, будут не валидны! При удалении же, где-то 30 на 70.

И не изучай программирование на этом компиляторе. Он очень плохо соответствует стандарту! Потом если пересядишь на современный компилятор, окажется что кроме теории ты ничего не знаешь!!!! Вот тогда ты осознаешь что такое ж*** smile 
PM MAIL   Вверх
Riddik
Дата 27.6.2009, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На современном компиляторе я сижу тоже.

Насчёт vector в старой реализации не уверенн, но многочисленные тесты говорят пока в пользу моих выводов.
PM MAIL   Вверх
zim22
Дата 27.6.2009, 07:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



Цитата(Riddik @  27.6.2009,  05:41 Найти цитируемый пост)
Что такое?

Term что такое? тип? или имя функции?
в С++ обязательно указывать тип, в  отличии от С.

Код

void Term(void pf())
{   
    pf(); 
}



--------------------
PM MAIL   Вверх
Riddik
Дата 27.6.2009, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Конечно указывал. Term - функция-член.
Код

void Giper::Term(void (*pf)()) {...}

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


Опытный
**


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

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



Чтоб не было путаницы:

Код

class Giper
{
...
public:
void Term(rect&, void (*pf)()) {...}
};

void Nismo() {...}

Giper gip;
gip.Term(rectangle, Nismo);


Помогите, почему не хочет работать, сам не могу справиться.
Вот полный текст ошибки:

"error C2664: 'Term' : cannot convert parametr 2 from 'void (void)' to 'void (_cdecl *)(void)' 
None of the functions with this name in scope match the target type"
PM MAIL   Вверх
jonie
Дата 27.6.2009, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Код

#include "stdafx.h"

class TestC{
public:
    void Term(void (*pf)())
    {
        pf();
    }
};


void CallBack()
{
    printf("Im callback!");
}

int main(int argc, char* argv[])
{
    TestC tc;
    tc.Term(CallBack);
    return 0;
}


все ок.
user posted image

Обновление-то ставили?)

замените это:
Код

void Nismo() {...}

на
Код
void _cdecl Nismo() {...}




--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Riddik
Дата 27.6.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, что за обновление и где его взять?

Для моего VC 6 и с void _cdecl Nismo() {...} всё та же песня.
PM MAIL   Вверх
Riddik
Дата 27.6.2009, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хм... просто как пример у jonie и меня компилится... в чём же может быть ошибка...?

Класс c функцией-членом определён в одном файле, а вызывается она в другом... 
PM MAIL   Вверх
Riddik
Дата 27.6.2009, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я не совсем точно привёл мой код... 
Код

class Box 
{ 
public: 
void FuncP(void (*pf)()) {pf();} 
}; 

Box box_obj; 

class Just 
{ 
void Nismo() {} 
public: 
void Rel(); 
}; 
void Just::Rel() 
{ 
box_obj.FuncP(Nismo); 
/* на эту строчку ругается, что в вызове функции отсутствует список аргументов; используйте "&Just::Nismo" для создания указателя на член 

если сделать так box_obj.FuncP(&Just::Nismo); то ругается, что невозможно преобразовать параметр 1 из 'void (__cdecl Just::* )(void)' в 'void (__cdecl *)(void)' 
        Не существует контекста, в котором такое преобразование возможно 
*/ 
}


В общем, проблема возникает, когда в качестве параметра ф-ии передаётся адрес ф-ии - члена класса, если свободной ф-ии - то нет проблем. Можно как-нибудь разрешить это?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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