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

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

Войти
Регистрация
Восстановить пароль
 
 
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 213
#1

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

14.12.2015, 07:19. Просмотров 414. Ответов 18
Метки нет (Все метки)

Всем привет. Подскажите, пожалуйста, пример не очень сложной программы, в которой встречается указатель на функцию, принимающую параметр одного типа и возвращающую указатель на объект другого типа, т.е.
type1 *(*имя) (type2); например, вот такую int *(*name) (char)
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2015, 07:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатель на функцию возвращающую указатель (C++):

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

Реализовать функцию, возвращающую указатель на наименьший элемент матрицы - C++
Пожалуйста, помогите написать программу на массив Написать программу с функцией, аргументом которой передается двумерный числовой...

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

Передача умного указателя в функцию принимающую указатель на указатель - C++
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Написать функцию принимающую массив и возвращающую указатель на динамический массив - C++
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий первые n нaибольших чисел. Как сделать...

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

18
egor2116
342 / 373 / 42
Регистрация: 20.01.2013
Сообщений: 1,133
14.12.2015, 09:51 #2
Наверное как то так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
 
typedef int (*GET)(char);
 
int getCodSymbol(char c){
        return (int)c;
}
 
void printCodSymbol(GET p_GET, char c){
    std::cout << p_GET(c) << std::endl;
}
 
int main()
{
   printCodSymbol(getCodSymbol, 'c'); 
    return 0;
}
Добавлено через 28 минут

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
typedef int * (*GET)(char);
 
int * getCodSymbol(char c){
    int var = (int)c;
        return &var;
}
 
void printCodSymbol(GET p_GET, char c){
    std::cout << *p_GET(c) << std::endl;
}
 
int main()
{
   printCodSymbol(getCodSymbol, 'c'); 
    return 0;
}
1
daslex
1287 / 531 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
14.12.2015, 14:20 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo(const char* ){
   int *pch = new int;
   *pch = 123;
   return pch;  //Возвращаем указатель
}
 
int main()
{
   const char* pch = "HELLO"; //Что-то, что принимает функция
 
 int* (*p)(const char*) = foo; //Инициализируем указатель, указывающий на функцию с одним параметром const char*, возвращающую указатель на int
 //p = foo;   //Если не инициализировать, то простое присваивание
 
  int *ptr = p(pch);  //Нужно для корректной очистки.
  int a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
  std::cout << a << '\n';
  delete ptr; //Чистим память.
 
 system("PAUSE");
}
1
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 213
14.12.2015, 17:43  [ТС] #4
egor2116, уточните, пожалуйста, что делает эта программа. Выводится число 99 на экран. Хотелось бы понять почему?

daslex, то есть строка 15 нам не нужна здесь?
0
rikimaru2013
C++ Game Dev
2443 / 1136 / 240
Регистрация: 30.11.2013
Сообщений: 3,696
14.12.2015, 17:50 #5
Цитата Сообщение от tst Посмотреть сообщение
уточните, пожалуйста, что делает эта программа
Показывает один из case'ов UB

http://rextester.com/SMJT2427
http://rextester.com/YGWWS44422
http://rextester.com/RIC18438

3 компилятора - 3 разные значения - вы, ТС, скажите почему такое поведение ?
2
daslex
1287 / 531 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
14.12.2015, 17:55 #6
Цитата Сообщение от tst Посмотреть сообщение
daslex, то есть строка 15 нам не нужна здесь?
Она нужна если в коде больше чем одна функция и нужна не инициализация указателя адресом функции, а работа с указателем, показывающем на разные функции.

Кликните здесь для просмотра всего текста
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
31
32
33
34
35
36
37
38
#include <iostream>
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo(const char* ){
   int *pch = new int;
   *pch = 123;
   return pch;  //Возвращаем указатель
}
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo2(const char* ){
   int *pch = new int;
   *pch = 525;
   return pch;  //Возвращаем указатель
}
 
int main()
{
   const char* pch = "HELLO"; //Что-то, что принимает функция
 
 int* (*p)(const char*); //Инициализируем указатель, указывающий на функцию с одним параметром const char*, возвращающую указатель на int
  p = foo;   //Если не инициализировать, то простое присваивание
 
  int *ptr = p(pch);  //Нужно для корректной очистки.
  int a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
  std::cout << a << '\n';
  delete ptr; //Чистим память.
 
  /////////////////////////
  p = foo2; //Сейчас указатель есть, но функции еще не вызывалось
  p(pch);  //Вызов функции foo2 использованием указателя p и параметра pch
  a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
  std::cout << a << '\n';
  delete ptr; //Чистим память.
 
 
 system("PAUSE");
}
1
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 213
14.12.2015, 18:03  [ТС] #7
rikimaru2013, что такое ub? По всей видимости, 99 - это значение для Visual Studio

daslex, большое спасибо, очень понятно объясняете
0
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 213
14.12.2015, 18:11  [ТС] #8
При запуске последнего кода появилось сообщение
0
Миниатюры
Указатель на функцию возвращающую указатель  
daslex
14.12.2015, 18:25
  #9

Не по теме:

Попробуйте заново. Есть вероятность, что я выложил некорректный вариант и быстро его исправил, а вы его (некорректный) подхватить успели.

0
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 213
14.12.2015, 18:37  [ТС] #10
daslex, перепроверила, все-таки это окошко остается
0
Kastaneda
Jesus loves me
Эксперт С++
4703 / 2907 / 239
Регистрация: 12.12.2009
Сообщений: 7,406
Записей в блоге: 2
Завершенные тесты: 1
14.12.2015, 18:45 #11
tst, daslex, второй delete ptr; вызывает это окошко.
2
daslex
1287 / 531 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
14.12.2015, 18:51 #12
Kastaneda, не должен. Когда вызывается функция (а она у меня однозначно вызывается) создается новый указатель, который я возвращаю. Его я удаляю. 2 вызова функции - 2 new, 2 delete.
0
tst
0 / 0 / 0
Регистрация: 23.08.2015
Сообщений: 213
14.12.2015, 19:04  [ТС] #13
daslex, А верно, если удаляю строку со вторым delete - то и окошко пропадает
0
Kastaneda
Jesus loves me
Эксперт С++
4703 / 2907 / 239
Регистрация: 12.12.2009
Сообщений: 7,406
Записей в блоге: 2
Завершенные тесты: 1
14.12.2015, 19:07 #14
Цитата Сообщение от daslex Посмотреть сообщение
Когда вызывается функция (а она у меня однозначно вызывается) создается новый указатель, который я возвращаю. Его я удаляю. 2 вызова функции - 2 new, 2 delete.
Еще раз на свой код посмотри

Добавлено через 2 минуты
tst, смысл не в том, чтобы удалить второй delete ptr;, а в том, чтобы заставить его правильно работать
1
daslex
1287 / 531 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
14.12.2015, 19:14 #15
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Нашел ошибку свою.
Вот.
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
31
32
33
34
35
36
37
38
39
#include <iostream>
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo(const char*) {
    int *pch = new int;
    *pch = 123;
    return pch;  //Возвращаем указатель
}
 
/*ФУНКЦИЯ ВОЗВРАЩАЕТ УКАЗАТЕЛЬ НА int*/
int *foo2(const char*) {
    int *pch = new int;
    *pch = 525;
    return pch;  //Возвращаем указатель
}
 
int main()
{
    
        const char* pch = "HELLO"; //Что-то, что принимает функция
 
        int* (*p)(const char*); //Инициализируем указатель, указывающий на функцию с одним параметром const char*, возвращающую указатель на int
        p = foo;   //Если не инициализировать, то простое присваивание
 
        int *ptr = p(pch);  //Нужно для корректной очистки.
        int a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
        std::cout << a << '\n';
        delete ptr; //Чистим память.
 
                    /////////////////////////
        p = foo2; //Сейчас указатель есть, но функции еще не вызывалось
        ptr = p(pch);  //Вызов функции foo2 использованием указателя p и параметра pch
        a = *ptr;  //Забираем значение из адреса, на который указывает указатель, возвращенный из функции
        std::cout << a << '\n';
        delete ptr; //Чистим память.
    
 
    system("PAUSE");
}
Добавлено через 5 минут

Не по теме:

Цитата Сообщение от Kastaneda Посмотреть сообщение
а в том, чтобы заставить его правильно работать
он - то правильно работает. Что сказали - то и сделает.

1
14.12.2015, 19:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2015, 19:14
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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