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

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

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

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

08.08.2014, 15:16. Просмотров 293. Ответов 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()?
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2014, 15:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на функцию, укзатель на воид и возвращаемое функцией значение (C++):

Значение, возвращаемое функцией (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
7148 / 4289 / 967
Регистрация: 30.01.2014
Сообщений: 7,091
08.08.2014, 16:09 #2
Цитата Сообщение от orange_fox Посмотреть сообщение
Есть функция, которая принимает указатель на void, и выполняет функцию, преобразовав указатель к void(*)();
Так делать нельзя.
Цитата Сообщение от orange_fox Посмотреть сообщение
Собственно, вопрос: безопасно ли использовать эту функцию для подобных вызовов?
Где-то может и будет работать. Но это UB. К тому же указатель на функцию не приводится автоматически к void*, поэтому вот этот код
C++
1
execute(a);
скорее всего не скомпилируется (т.е. нужен будет еще один явный каст). Но тогда уж лучше использовать нечто вроде void(*)(...) вместо void*.
Цитата Сообщение от orange_fox Посмотреть сообщение
Если да, то как сделать безопасный аналог функции execute()?
Шаблон.
0
orange_fox
34 / 34 / 6
Регистрация: 06.04.2014
Сообщений: 189
08.08.2014, 16:28  [ТС] #3
Цитата Сообщение от DrOffset Посмотреть сообщение
скорее всего не скомпилируется
Хотел делать каст, но в VS2013 скомпилировался даже без каста.
Цитата Сообщение от DrOffset Посмотреть сообщение
Но это UB.
что это?
Цитата Сообщение от DrOffset Посмотреть сообщение
Шаблон.
Можно пример для моего случая?
0
DrOffset
7148 / 4289 / 967
Регистрация: 30.01.2014
Сообщений: 7,091
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 *. Он предназначен для хранения адресов данных. Для адресов функций по вышеизложенным причинам в общем случае он не подойдет.
1
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++
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.08.2014, 16:44
Ответ Создать тему
Опции темы

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