Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
1 / 1 / 0
Регистрация: 23.08.2015
Сообщений: 216
1

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

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

Всем привет. Подскажите, пожалуйста, пример не очень сложной программы, в которой встречается указатель на функцию, принимающую параметр одного типа и возвращающую указатель на объект другого типа, т.е.
type1 *(*имя) (type2); например, вот такую int *(*name) (char)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.12.2015, 07:19
Ответы с готовыми решениями:

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

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

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

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){};...

18
582 / 385 / 216
Регистрация: 20.01.2013
Сообщений: 1,169
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
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
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
1 / 1 / 0
Регистрация: 23.08.2015
Сообщений: 216
14.12.2015, 17:43  [ТС] 4
egor2116, уточните, пожалуйста, что делает эта программа. Выводится число 99 на экран. Хотелось бы понять почему?

daslex, то есть строка 15 нам не нужна здесь?
0
2540 / 1199 / 358
Регистрация: 30.11.2013
Сообщений: 3,819
14.12.2015, 17:50 5
Цитата Сообщение от tst Посмотреть сообщение
уточните, пожалуйста, что делает эта программа
Показывает один из case'ов UB

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

3 компилятора - 3 разные значения - вы, ТС, скажите почему такое поведение ?
2
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
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
1 / 1 / 0
Регистрация: 23.08.2015
Сообщений: 216
14.12.2015, 18:03  [ТС] 7
rikimaru2013, что такое ub? По всей видимости, 99 - это значение для Visual Studio

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

Не по теме:

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

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

Добавлено через 2 минуты
tst, смысл не в том, чтобы удалить второй delete ptr;, а в том, чтобы заставить его правильно работать
1
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
14.12.2015, 19:14 15
Лучший ответ Сообщение было отмечено tst как решение

Решение

Нашел ошибку свою.
Вот.
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
1 / 1 / 0
Регистрация: 23.08.2015
Сообщений: 216
14.12.2015, 21:59  [ТС] 16
Возник еще такой вопрос - есть функция int *foo(const char* ), в качестве аргумента которой const char*. Подскажите, пожалуйста, в чем смысл этого аргумента
0
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
14.12.2015, 23:12 17
В моем коде вообще ни в чем.
Цитата Сообщение от tst Посмотреть сообщение
указатель на функцию, принимающую параметр одного типа и возвращающую указатель на объект другого типа
надо было параметр. получили параметр.
0
1 / 1 / 0
Регистрация: 23.08.2015
Сообщений: 216
14.12.2015, 23:18  [ТС] 18
А если в общем - он является константным указателем? - просто впервые сталкиваюсь с таким, обычно звездочка стояла перед именем
0
1362 / 586 / 198
Регистрация: 02.08.2011
Сообщений: 2,880
15.12.2015, 00:29 19
C++
1
int *foo2(char* const) ;
Я просто использую пустое имя, чтобы оно глаза не мозолило за ненужностью. Чтобы к нему можно было обращаться, это имя стоит дописать в самый конец параметра
C++
1
int *foo2(const char* const NAME)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.12.2015, 00:29

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

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

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

Написать функцию принимающую массив и возвращающую указатель на динамический массив
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий...

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


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

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

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