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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
#1

Функция должна принять указатель на саму себя - C++

07.01.2014, 22:48. Просмотров 1270. Ответов 46
Метки нет (Все метки)

не рекурсия. (ошибка в названии)
Функция должна принять указатель на саму себя.
моя неверная попытка имеет вид
C++
1
2
3
4
5
6
7
8
9
10
11
int myfunc(int (*P)(int))  принимаю указатель на функцию
{
   return 0;
}
 
int main()
{
  int (*P)( int (*)(int) ); //создаю указатель на функцию
  P=myfunc; //присваиваю в указатель адрес функции
  myfunc(P); //попытка передарь функции указатель на саму себя. неверная.
}
Это как делается?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2014, 22:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Функция должна принять указатель на саму себя (C++):

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

Подскажите немножко с рекурсией ( Функция должна вызывать сама себя до тех пор пока sum не станет больше х) - C++
Вводим число х. Функция должна вызывать сама себя до тех пор пока sum не станет больше х. Но программа выдает ошибку, Подскажите в чем...

Перемножить матрицу на саму себя - C++
Подскажите пожалуйста, как можно реализовать эту задачу: Нужно будет перемножить матрицу на саму себя. Вот пример: Матрица 1: 0 A B ...

Почему C++ программа не удаляет саму себя? - C++
Имеется следующий код (файл 01del.cpp): #include <windows.h> using namespace std; int main() { system("del /q...

Как принять код клавиши, а вписать саму клавишу? (Принимает "57", что означает "9") - C++
Нужно избавиться от такой глупости: char ch = 0; if(ch=='1')mas=1; if(ch=='2')mas=2; if(ch=='3')mas=3; ...

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

46
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2014, 22:58 #2
Цитата Сообщение от daslex Посмотреть сообщение
попытка передарь функции указатель на саму себя. неверная.
Оно и понятно
Цитата Сообщение от daslex Посмотреть сообщение
int myfunc(int (*P)(int))
int (*P)(int) это указать на функцию которая возвращает инт и принимает в качестве параметра инт.
Цитата Сообщение от daslex Посмотреть сообщение
myfunc(P)
а тут ты передаешь указатель вместо инта wtf?
1
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.01.2014, 23:00 #3
скорее всего задуманное не выйдет без каких-нибудь reinterpret_cast -ов
C++
1
2
3
4
int myfunc(int (*P)(int))  принимаю указатель на функцию
{
   return 0;
}
тут тип аргумента - указатель на функцию, которая принимает инт.
а ваша функция принимает указатель на функцию.
итого получаем разные сигнатуры.
если принимать указатель на функию, которая принимает указатель на функцию, которая принимает
указатель на функцию, которая ...
получается своего рода рекурсия или зациклинность. не получится задать тип такого аргумента.
если функция будет принимать какой-нибудь void* и кастить его к нужной сигнатуре - то может
быть и выйдет.
1
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2014, 23:03 #4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <functional>
 
int next(const std::function<int(int)> &func)
{
    return func(10);
}
 
int main()
{
    auto func = [](const int &value){ return value * 2; };
    std::cout << next(func);
}
1
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
07.01.2014, 23:08  [ТС] #5
outoftime, у меня CodeBlock ваш пример не компилирует, да и не понимаю я его.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.01.2014, 23:13 #6
этот пример неверный как мне кажется.
если я правильно понял, то должен скомпилится вызов:
C++
1
myfunc(&myfunc);
так вот пример outoftime - это просто передача в одну функцию другого функтора (такое можно и без std::function сделать, но это не то, что нужно)

а не компиляться может из-за не поддержки c++11
1
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2014, 23:14 #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <functional>
 
template<typename OutputType, typename... Params>
OutputType foo(const std::function<OutputType(Params...)> &func)
{
    return func(10);
}
 
int main()
{
    std::function<int(int)> func = [](const int &value){ return value * 2; };
    std::function<bool(int)> odd = [](const int &value){ return value & 1; };
    std::cout << foo(func) << " " << std::boolalpha << foo(odd);
}
1
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
07.01.2014, 23:27  [ТС] #8
Цитата Сообщение от DU Посмотреть сообщение
myfunc(&myfunc);
вы правильно поняли.

Не по теме:

outoftime, я не понимаю, сказал ведь). Да и не компилируется у меня.

0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2014, 23:36 #9
DU, да, действительно, мой косяк. И все равно вариант с std::function мне куда больше нравится.

Добавлено через 4 минуты
Цитата Сообщение от daslex Посмотреть сообщение
CodeBlock ваш пример не компилирует
Project -> Build options -> Have g++ follow the C++11 ISO C++ language standart [-std=c++11]

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <functional>
 
template<typename OutputType, typename... Params>
OutputType foo(const std::function<OutputType(Params...)> &func, Params... params)
{
    return func(params...);
}
 
int main()
{
    std::function<int(int)> func = [](const int &value){ return value * 2; };
    std::function<bool(int)> odd = [](const int &value){ return value & 1; };
    std::function<double(int,int)> div = [](const int &a, const int &b){ return double(a) / b; };
    std::cout << foo(func, 10) << " " << std::boolalpha << foo(odd, 21) << " " << foo(div, 1, 2);
}
foo в данном случае шаблонная функция которая просто перевызывает функтор переданный ей в качестве аргумента.
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.01.2014, 23:50 #10
это опять не то.
в функцию foo нужно передать указатель на foo (завернутый в std::function или нет - не важно).
т.е. что-то вроде:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <functional>
 
typedef std::function<int (???)> Func; // что вместо '???'
 
int foo(Func func)
{
  return func(&foo);
}
 
int main()
{
  std::cout << foo(&foo) << std::endl;
  return 0;
}
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
07.01.2014, 23:53 #11
DU, Это уже зависит от базы рекурсии.
0
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
07.01.2014, 23:54  [ТС] #12
Показываю то, что нашел на другом форуме.
C++
1
2
3
4
5
6
7
8
9
10
11
12
typedef void (*f1)();
typedef void (*f2)(f1);
 
void func(f2 f)
{
  f((f1)func);
}
 
int main()
{
   func((f2)func);
}
только как если бы без typedef было не понимаю.
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
08.01.2014, 00:00 #13
daslex, можете конкретизировать задание?

Добавлено через 4 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <functional>
 
//typedef void (*f1)();
//typedef void (*f2)(f1);
 
void func(void (*f)(void(*)()))
{
  //f((f1)func);
  f((void(*)())func);
}
 
int main()
{
   //func((f2)func);
   func((void(*)(void(*)()))func);
}
Лично у меня этот прикол падает (:
1
daslex
1286 / 530 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
08.01.2014, 00:06  [ТС] #14
Могу ли? Не знаю как хорошо получится.
Должен быть указатель, который указывает на функцию.
Этот указатель должен быть передан вовнутрь функции как параметр.
Должен произойти вызов функции.

если отбросить правила, то это выглядит как-то так
========================
void *Ptr = myfunc() //Указатель указывает на функцию
myfunc(Ptr) //Должен произойти Вызов функции.
=========================
Это задание не на СТЛ или С11, а на работу с указателями на функции.

Добавлено через 1 минуту
Цитата Сообщение от outoftime Посмотреть сообщение
Лично у меня этот прикол падает (:
он и должен падать. Главное вызов происходит.
Рекурсия же не останавливается
0
outoftime
║XLR8║
511 / 433 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
08.01.2014, 00:11 #15
http://www.parashift.com/c++-faq-lite/pointers-to-members.html
Когда-то нашел офигенный туториал по указателям на функции, но я его не сохранил. Посмотрите это, может поможет.

Добавлено через 2 минуты
http://www.newty.de/fpt/index.html что-то типа, жаль оформление не очень, но материал хороший
1
08.01.2014, 00:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2014, 00:11
Привет! Вот еще темы с ответами:

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

Функция принимает указатель на void и возвращает указатель на int - C++
Запишите прототип функции, которая принимает указатель на void и возвращает указатель на int.

Указатель в списке ссылается на себя, а не на следующий элемент - C++
Уважаемые, форумчане! Помогите разобраться в вопросе. Я хочу реализовать стек(добавление элемента) на основе односвязного списка. ...

Деструктор для класс, имеющий указатель на самого себя - C++
Здравствуйте. Дан класс, для него нужно написать деструктор. using namespace std; class List{ private: int myValue; List...


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

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

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