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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приведение типов указателей на функции. 
V
    Опции темы
Elfet
Дата 23.11.2009, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Приветствую!

Помогите пожалуйста, разобраться с приведение типов указателей функций. 

Мне нужен callback для отображения процесса в прогрессбаре. Для этого решил делать через указатели на функции:
Код

void SmartFlowLib::CollectSurrounding(int deep, void (*progress)(int));


И вызываю из класса MainWindow:
Код

sflib->CollectSurrounding(5, Progress);



Но это не работает, видимо мне както нужно преобразовать тип из  void (MainWindow::*)(int) в void (*)(int)

Расскжите как это можно сделать?

Заранее спасибо!


--------------------
PM MAIL WWW Skype   Вверх
Abyx
Дата 23.11.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Elfet, указатель на метод, это не указатель на функцию

Добавлено через 3 минуты и 4 секунды
какбэ надо 
void (MainWindow::*progress)(int)
и вызывать как 
(mainWindowObject->*progress)(123)

или использовать bind
sflib->CollectSurrounding(5, boost::bind(&MainWindow::Progress,mainWindowObject,_1) );
PM MAIL   Вверх
Elfet
Дата 23.11.2009, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Abyx, ясно. А что это такое bind?


--------------------
PM MAIL WWW Skype   Вверх
niXman
Дата 23.11.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Elfet @  23.11.2009,  17:40 Найти цитируемый пост)
А что это такое bind? 

http://www.boost.org/doc/libs/1_41_0/libs/bind/bind.html
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Abyx
Дата 23.11.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



функция.
http://www.boost.org/doc/libs/1_41_0/libs/bind/bind.html

в STL вроде тоже было что-то такое

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


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Мне на bind выдаёт вот это: 
Код

error: no matching function for call to `SmartFlowLib::CollectSurrounding(int, boost::_bi::bind_t<void, boost::_mfi::mf1<void, MainWindow, int>, boost::_bi::list2<boost::_bi::value<MainWindow*>, boost::arg<1> (*)()> >)'



--------------------
PM MAIL WWW Skype   Вверх
niXman
Дата 23.11.2009, 19:47 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Добавлено @ 19:50
Elfet, Нужно использовать boost: http://www.boost.org/


Это сообщение отредактировал(а) niXman - 23.11.2009, 20:02
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Abyx
Дата 23.11.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



niXman, это какбэ не то

Добавлено через 15 секунд
Цитата(niXman @  23.11.2009,  19:47 Найти цитируемый пост)
http://www.cplusplus.com/reference/std/fun...al/mem_fun_ref/ 


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


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



niXman, я буст и использую. Тока вот такую ошибку выдаёт:
Цитата

no matching function for call to `SmartFlowLib::CollectSurrounding(int, boost::_bi::bind_t<void, boost::_mfi::mf1<void, MainWindow, int>, boost::_bi::list2<boost::_bi::value<MainWindow*>, boost::arg<1> (*)()> >)'
note: candidates are: void SmartFlowLib::CollectSurrounding(int, void (*)(int))



--------------------
PM MAIL WWW Skype   Вверх
Abyx
Дата 23.11.2009, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Elfet,  покажи минимальный код, необходимый для воспроизведения ошибки =)
(пока будешь его писать - сам найдеш ошибку)

или хотябы строчку с bind

а то в ошибке явно что-то не то написано

PM MAIL   Вверх
niXman
Дата 23.11.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Abyx @  23.11.2009,  17:51 Найти цитируемый пост)
niXman, это какбэ не то

 smile 
и в правду не то smile 
--------------------
if ( !c++ ) {   *power--;   this->wussiness += 10;}
PM MAIL   Вверх
Elfet
Дата 23.11.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Функция в классе Mesh из SmartFlowLib:
Код

void Mesh::CollectSurrounding(int deep, void (*progress)(int))
{
    unsigned size = elements->size();
    for(unsigned i = 0; i < size; i++)
    {
        Element * element = elements->at(i);
        element->CollectSurrounding(deep);

        if(progress)
            (*progress)(100*i/size);
    }
}


Вызываю её из MainWindow:
Код

void MainWindow::Update()
{
....

    sflib->CollectSurrounding(5, boost::bind(&MainWindow::Progress,this,_1) );

...
}


Добавлено через 1 минуту и 49 секунд
Нужно короче из одного метода одного класса, вызвать другой метод, др. класса и так что бы они друг о друге на знали ничего. smile


--------------------
PM MAIL WWW Skype   Вверх
Abyx
Дата 23.11.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



а сигнатура MainWindow::Progress как выглядит?
PM MAIL   Вверх
Elfet
Дата 23.11.2009, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Белый и Пушистый
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003

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



Код

void MainWindow::Progress(int value)
{
    ui->progressBar->setValue(value);
}



--------------------
PM MAIL WWW Skype   Вверх
Abyx
Дата 23.11.2009, 22:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



сегодня мои телепатические способности на нуле, так что хз где там ошибка.

однако лучшее решение - это сразу писать обобщенный код
Код

template<typename Handler>
void Mesh::CollectSurrounding(int deep, Handler progress)

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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