Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
#1

Указатель на функцию, укзатель на воид и возвращаемое функцией значение - C++

08.08.2014, 15:16. Просмотров 290. Ответов 3
Метки нет (Все метки)

Есть функции, идентичные по функционалу, но возвращающие значения разных типов(сами значения не важны).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
double a()
{
    cout << 123 << endl;
    return 23.4;
}
int b()
{
    cout << 123 << endl;
    return 11;
}
 
string c()
{
    cout << 123 << endl;
    return "string";
}
Есть функция, которая принимает указатель на void, и выполняет функцию, преобразовав указатель к void(*)();
C++
1
2
3
4
void execute(void* func)
{
    ((void(*)())func)();
}
Собственно, вопрос: безопасно ли использовать эту функцию для подобных вызовов?
C++
1
2
3
execute(a);
execute(b);
execute(c);
Влияет ли как-то несовпадающий тип возвращаемого значения?

Если да, то как сделать безопасный аналог функции execute()?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2014, 15:16     Указатель на функцию, укзатель на воид и возвращаемое функцией значение
Посмотрите здесь:

Значение, возвращаемое функцией (C++) - C++
В общем, задача такая. Написать программу, печатающую все вводимые символы в нижнем регистре. Программа должна использовать цикл while....

Как присвоить значение возвращаемое функцией? - C++
#include &lt;iostream.h&gt; char* abc(int num){ static char masiv; masiv = num+'0'; return masiv; } main(){ char...

Как передать значение переменной из функции инт в функцию воид? - C++
Как передать значения а и b из int start(void) в void inputfile(void), чтоб строка 34 и т.д. работала в иной функции? int x, y,...

Возвращаемое значение функции - указатель на массив. КАК это записать? - C++
Функция заполняет массив. например (кусок проги) .... int mas; int fun() { заполнила массив

Непонятно выражение "значение, возвращаемое функцией" - C++
Уважаемые господа. Мне немного непонятно выражение &quot;значение, возвращаемое функцией&quot;. Возвращаемое чему? и зачем?

Определить функцию для расчета суммы цифр натурального числа. Входной параметр – число. Возвращаемое значение – сумма. - C++
Помогите пожалуйста написать программу на с++ очень нужно Определить функцию для расчета суммы цифр натурального числа. Входной параметр...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
08.08.2014, 16:09     Указатель на функцию, укзатель на воид и возвращаемое функцией значение #2
Цитата Сообщение от orange_fox Посмотреть сообщение
Есть функция, которая принимает указатель на void, и выполняет функцию, преобразовав указатель к void(*)();
Так делать нельзя.
Цитата Сообщение от orange_fox Посмотреть сообщение
Собственно, вопрос: безопасно ли использовать эту функцию для подобных вызовов?
Где-то может и будет работать. Но это UB. К тому же указатель на функцию не приводится автоматически к void*, поэтому вот этот код
C++
1
execute(a);
скорее всего не скомпилируется (т.е. нужен будет еще один явный каст). Но тогда уж лучше использовать нечто вроде void(*)(...) вместо void*.
Цитата Сообщение от orange_fox Посмотреть сообщение
Если да, то как сделать безопасный аналог функции execute()?
Шаблон.
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
08.08.2014, 16:28  [ТС]     Указатель на функцию, укзатель на воид и возвращаемое функцией значение #3
Цитата Сообщение от DrOffset Посмотреть сообщение
скорее всего не скомпилируется
Хотел делать каст, но в VS2013 скомпилировался даже без каста.
Цитата Сообщение от DrOffset Посмотреть сообщение
Но это UB.
что это?
Цитата Сообщение от DrOffset Посмотреть сообщение
Шаблон.
Можно пример для моего случая?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2014, 16:44     Указатель на функцию, укзатель на воид и возвращаемое функцией значение
Еще ссылки по теме:

Определить функцию для расчета суммы цифр натурального числа. Входной параметр – число. Возвращаемое значение – сумма - C++
Помогите написать пожалуйста программу на C++ Oпределить функцию для расчета суммы цифр натурального числа. Входной параметр – число....

Множество возвращаемое функцией как результат - C++
Помогите пожалуйста с возвратом множества, как результата работы функции. int Cross(){ set&lt;int&gt; b; ...

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

Возвращаемое значение - C++
Как сделать так, что бы в зависимости от подаваемых аргументов, функция возвращала разные значения? Пробовал через шаблоны, но не...


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

Или воспользуйтесь поиском по форуму:
DrOffset
7058 / 4199 / 949
Регистрация: 30.01.2014
Сообщений: 6,965
08.08.2014, 16:44     Указатель на функцию, укзатель на воид и возвращаемое функцией значение #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от orange_fox Посмотреть сообщение
Хотел делать каст, но в VS2013 скомпилировался даже без каста.
Это бывает. Тем не менее на других компиляторах этот код приведет к ошибке.
Цитата Сообщение от orange_fox Посмотреть сообщение
что это?
Undefined\Unspecified behaviour - неопределенное поведение. Ситуация, когда стандартом языка не может быть гарантировано адекватное исполнение в общем случае. Конкретно в этом случае есть платформы, где сегменты кода и сегменты данных - это разные области и адресация там тоже может быть разная (разная вплоть до физического представления). Следовательно нет возможности гарантировать приводимость адресов из одного сегмента в другой (более того, зачастую, это бессмысленно). Для x86 этот код будет работать, но, в том числе, из-за описанного выше, писать нестандартный или завязанный на UB код крайне не рекомендуется (особенно в профессиональной разработке - ведь неизвестно на какую платформу менеджмент в будущем захочет портировать уже написанный софт).
Кстати также нельзя в общем случае гарантировать приводимость указателя к целому числу без потерь, хотя опять же, на x86 это работает и многие уверены что так будет везде.
Цитата Сообщение от orange_fox Посмотреть сообщение
Можно пример для моего случая?
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
double a()
{
    cout << 123 << endl;
    return 23.4;
}
int b()
{
    cout << 123 << endl;
    return 11;
}
 
string c()
{
    cout << 123 << endl;
    return "string";
}
 
template <typename FunctorT>
void execute(FunctorT f)
{
    f();
}
 
 
int main()
{
    execute(a);
    execute(b);
    execute(c);
}
Добавлено через 3 минуты
orange_fox, немного не акцентировал суть насчет void *. Он предназначен для хранения адресов данных. Для адресов функций по вышеизложенным причинам в общем случае он не подойдет.
Yandex
Объявления
08.08.2014, 16:44     Указатель на функцию, укзатель на воид и возвращаемое функцией значение
Ответ Создать тему
Опции темы

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