Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
1

Передача параметра в функцию

15.01.2014, 23:36. Просмотров 680. Ответов 11
Метки нет (Все метки)

Проблема заключается в следующем.
Есть функция, вот её прототип.
C++
1
void attachInterrupt(uint8_t interruptNum, void (*userFunc)(void), int mode);
есть так же класс
C++
1
2
3
4
5
6
class Foo
{
    ..
    void ololo();
    ..
}
в его конструкторе я пытаюсь вызвать функцию attachInterrupt следующим образом
C++
1
attachInterrupt(0, this->ololo, FALLING);
на что получаю ответ
C++
1
error: cannot convert ‘Foo::ololo’ from type ‘void* (Foo::)()’ to type ‘void (*)()
Понимаю, что вся проблема скорее всего в том, что надо правильно преобразовать типы, но не могу допереть как именно. Если вызывать attachInterrupt не из класса и не для члена класса, то всё работает. Подскажите пожалуйста, как правильно вызвать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.01.2014, 23:36
Ответы с готовыми решениями:

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

Передача параметра в функцию класса
Здравствуйте. Столкнулся с проблемой. Почему переменная "x" не становится равна 25? #include...

Передача файла в функцию в качестве параметра
Здравствуйте! Подскажите, как передать файловый поток в функцию? int main() { ifstream...

Передача файла в функцию в качестве параметра
Имеется такой код, который, по идее, должен создавать файл с записями и кое-как их потом...

11
5478 / 4873 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 00:20 2
Указатель на метод - это не указатель на функцию.
1
Модератор
Эксперт по электронике
8333 / 6185 / 829
Регистрация: 14.02.2011
Сообщений: 21,482
16.01.2014, 00:23 3
сделай метод статик
при компиляции программы неизвестен адрес метода
вдруг ни одного объекта не будет
а статик гарантировано ляжет в память
1
5478 / 4873 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 00:24 4
C++
1
2
void attachInterrupt(char interruptNum, void (Foo::*userFunc)(void), int mode);
attachInterrupt(0, &Foo::ololo, FALLING);
2
Модератор
Эксперт по электронике
8333 / 6185 / 829
Регистрация: 14.02.2011
Сообщений: 21,482
16.01.2014, 00:26 5
Цитата Сообщение от alsav22 Посмотреть сообщение
&Foo::ololo
мдя про это я и забыл давненько указателями на методы не пользовался
0
5478 / 4873 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
16.01.2014, 00:39 6
Цитата Сообщение от alsav22 Посмотреть сообщение
C++
1
2
void attachInterrupt(char interruptNum, void (Foo::*userFunc)(void), int mode);
attachInterrupt(0, &Foo::ololo, FALLING);
Но использовать указатель на метод, без привязки к объекту, не получится. Поэтому:
C++
1
2
3
4
5
6
7
8
void attachInterrupt(char interruptNum, Foo* obj, void (Foo::*userFunc)(void), int mode)
{
    (obj ->*userFunc)();
}
Foo()
{
    attachInterrupt(0, this, &Foo::ololo, FALLING);
}
1
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
16.01.2014, 00:44  [ТС] 7
дело в том, что attachInterrupt библиотечная функция, не факт, что я буду использовать её только в этом куске кода, поэтому переделать её будет неправильно. сделал метод static, но теперь из него не могу обратиться к другим членам класса Foo через this.
0
Модератор
Эксперт по электронике
8333 / 6185 / 829
Регистрация: 14.02.2011
Сообщений: 21,482
16.01.2014, 00:57 8
Цитата Сообщение от [WRG] Посмотреть сообщение
но теперь из него не могу обратиться к другим членам класса Foo через this.
потому что она одна на все объекты
и не знает к кому обращаться, придется передавать указатель на объект
посмотри как устроены потоковые функции и функции обратного вызова когда они методы класса

Добавлено через 57 секунд
в общем это показал alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
attachInterrupt(0, this, &Foo::ololo, FALLING);
1
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
16.01.2014, 11:07  [ТС] 9
Кажется понял, в чем моя ошибка. Получается, можно переопределить attachInterrupt, а можно написать обёртку, но это костыль.
0
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
20.01.2014, 20:23  [ТС] 10
пока сделал так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Foo
{
    ..
    void ololo();
    ..
}
 
void leftOptoInterrupt()
{
    foo.ololo();
}
 
int main()
{
    Foo foo;
    attachInterrupt(0, leftOptoInterrupt, FALLING);
}
0
5478 / 4873 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
20.01.2014, 20:36 11
Цитата Сообщение от [WRG] Посмотреть сообщение
пока сделал так
C++
1
2
3
4
void leftOptoInterrupt()
{
    foo.ololo();
}
А foo откуда? Глобальный объект?
0
52 / 52 / 37
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
20.01.2014, 20:58  [ТС] 12
Да, на самом деле он глобальный. Ошибся при набивании псевдокода.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.01.2014, 20:58

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

Передача массива в функцию в качестве параметра
Всем привет! Файл с реализацией: int Init_can::Send(int* msgdata) { //Send canmsg_t tx;...

Передача параметра по указателю в виртуальную функцию
Добрый вечер и с наступающим всех Новым Годом! условие задачи такое: Мышь (абстрактный) Вход:...

Передача массива в функцию в качестве параметра
Приветствую. Начал познавать замечательный С++ и сразу столкнулся с проблемой - передачей массивов...

Передача потока как параметра в функцию
Дорогие форумчане! Повторяю пример из книжки, пока остановился из-за ошибки. //Программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.