Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
#1

Указатель на функцию

29.07.2012, 18:48. Просмотров 1057. Ответов 21
Метки нет (Все метки)

Столкнулся с проблемой передачи функции в функцию как переменной. Не могли бы вы объяснить мне эту тему?

Компилятор ругается даже на:

C++
1
2
3
4
5
6
7
8
9
10
11
void z()
{
    
}
 
 
int main()
{
        void *f = &z;
        return 0;
}

И я не понимаю, почему?

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.07.2012, 18:48
Ответы с готовыми решениями:

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось...

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть...

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall...

Передать в неуправляемую функцию указатель на указатель
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr)...

21
Петррр
6156 / 3456 / 896
Регистрация: 28.10.2010
Сообщений: 5,926
29.07.2012, 18:51 #2
C++
1
2
3
4
5
6
7
8
9
void function()
{
}
 
int main()
{
    void (*ptrFun) = function;
    return 0;
}
0
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
29.07.2012, 18:52  [ТС] #3
Петррр,
C++
1
invalid conversion from `void (*)()' to `void*'
1) Все то же самое
2) мне скорей теоретические знания нужны. В принципе о том, что есть воид и как его передавать
0
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
29.07.2012, 18:58 #4
какой компилятор?
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
29.07.2012, 19:01 #5
А так?
C++
1
void (*ptrFun)() = function;
0
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
29.07.2012, 19:04  [ТС] #6
Schizorb, так работает
точно так же как и :

C++
1
void (*f) = (void*)(z);
и
C++
1
void (*f) = (void*)(&z);

но какой из вариантов правильный?
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
29.07.2012, 19:12 #7
Цитата Сообщение от Ksan Посмотреть сообщение
Schizorb, так работает
точно так же как и :

C++
1
void (*f) = (void*)(z);
и
C++
1
void (*f) = (void*)(&z);

но какой из вариантов правильный?
C++
1
void (*f)() = function;
Вот этот. То, что написали вы, это приведение правильного указателя к типу void* — а этот тип, это ни разу не указатель на функцию. Две скобки важны; это список аргументов функции, по нему и определяются указатели на функции.
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
29.07.2012, 19:14 #8
Насколько я понимаю, void (*f) - не указатель на функцию, а указатель на void. Ему можно присваивать адреса переменных других типов:

C++
1
2
int x;
void (*f) = &x;
А указатель на функцию должен иметь при себе список типов параметров
C++
1
void (*ptrFun)();
или допустим
C++
1
void (*ptrFun)(int, int);
0
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
29.07.2012, 19:33  [ТС] #9
Schizorb, так, это уже лучше. А возможно ли все это загнать в массив:
и func(int)
и func(double)
и func()
?
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
29.07.2012, 19:54 #10
Цитата Сообщение от Ksan Посмотреть сообщение
и func(int)
и func(double)
и func()
В один массив указатели разных типов вряд ли получится загнать. Например, для первого типа нужен будет массив:
C++
1
void (*arr[size])(int);
Для второго:
C++
1
void (*arr[size])(double);
Добавлено через 4 минуты
Если, конечно, приводить как вы делали указатель на функцию к указателю на void, то в массив можно поместить указатели на разные функции:

void * arr[size] = {(void*)funk1, (void*)funk2, (void*)funk3};

Правда что это даст? Указатель на void не получится разыменовать, следовательно и вызвать функцию.
1
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
29.07.2012, 20:04  [ТС] #11
Schizorb, почему указатель на воид нельзя разыменовать и тем самым вызвать воид? Я этого аспекта не понимаю

Добавлено через 5 минут
C++
1
2
3
void* f = (void*)&z;
void (*f2)() = (void(*)())f;
f2();

Работает
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
29.07.2012, 20:08 #12
Ksan, указатель хранит адрес, и при его разыменовании нужно точно знать, сколько байт начиная с этого адреса нужно считать. То есть нужно знать тип.

Добавлено через 2 минуты
Цитата Сообщение от Ksan Посмотреть сообщение
Работает
Неудивительно. Во второй строке вы явно преобразуете указатель void* в указатель на функцию возвращающую void и не принимающую аргументов.
1
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
29.07.2012, 20:16  [ТС] #13
Schizorb, ну так туда же можно и аргументы пихнуть
разве это проблема?
0
Schizorb
510 / 462 / 82
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
29.07.2012, 20:29 #14
Ksan, да извратиться то можно по всякому...

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
 
void foo1()
{
    std::cout << "foo1\n";
}
 
void foo2(int x)
{
    std::cout << "foo2, x = " << x << "\n";
}
 
void foo3(double x)
{
    std::cout << "foo3, x = " << x << "\n";
}
 
int main()
{ 
    const int size = 3;
    void * arr[size] = {(void*)foo1, (void*)foo2, (void*)foo3};
    
    ((void(*)())arr[0])();
   
    ((void(*)(int))arr[1])(7);
    
    ((void(*)(double))arr[2])(1.45);
 
    return 0;
}
Смысл тут городить массив, если через него неудобно вызывать функции, каждый раз делая преобразование...
0
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
29.07.2012, 20:31  [ТС] #15
Schizorb, потому что когда пишешь класс, который должен уметь вызывать все виды, это единственный выход
0
ForEveR
В астрале
Эксперт С++
7995 / 4754 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
29.07.2012, 21:01 #16
Ksan, Единственный выход это написать оператор вызова, который возвращает нечто и принимает разные параметры (перегрузки). С шаблономи с переменным числом аргументов это сделать просто.
0
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
29.07.2012, 21:03  [ТС] #17
ForEveR, а у шаблона может быть переменное число аргументов?
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.07.2012, 21:07 #18
Цитата Сообщение от Ksan Посмотреть сообщение
а у шаблона может быть переменное число аргументов?
Легко
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
template <class F, class... Args>
void foo(F&& function, Args&&... args)
{
    function(args...);
}
 
void bar(const int& a, const double& b)
{
    std::cout << a << ' ' << b << std::endl;
}
 
int main()
{
    foo(bar, 42, 3.14159);
    return 0;
}
Но в C++11
0
Ksan
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
29.07.2012, 21:11  [ТС] #19
soon, получается, нужна VS2012 beta?
0
soon
2545 / 1310 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
29.07.2012, 21:14 #20
Цитата Сообщение от Ksan Посмотреть сообщение
нужна VS2012 beta?
Без понятия, какая студия нужна. Частичная поддержка C++11 в ней, вроде как, уже давно.
0
29.07.2012, 21:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2012, 21:14

Указатель на функцию возвращающую указатель
Всем привет. Подскажите, пожалуйста, пример не очень сложной программы, в...

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

Как передать параметр типа "указатель на указатель" в функцию?
#include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace...


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

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

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