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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
07.01.2014, 22:48     Функция должна принять указатель на саму себя #1
не рекурсия. (ошибка в названии)
Функция должна принять указатель на саму себя.
моя неверная попытка имеет вид
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); //попытка передарь функции указатель на саму себя. неверная.
}
Это как делается?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2014, 22:48     Функция должна принять указатель на саму себя
Посмотрите здесь:

Функция вызывает сама себя 10 раз C++
Функция должна возвращать указатель на первый элемент массива,удовлетворяющий условию C++
C++ Функция должна вернуть 4 параметра
C++ Деструктор для класс, имеющий указатель на самого себя
C++ Подскажите немножко с рекурсией ( Функция должна вызывать сама себя до тех пор пока sum не станет больше х)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
07.01.2014, 22:58     Функция должна принять указатель на саму себя #2
Цитата Сообщение от daslex Посмотреть сообщение
попытка передарь функции указатель на саму себя. неверная.
Оно и понятно
Цитата Сообщение от daslex Посмотреть сообщение
int myfunc(int (*P)(int))
int (*P)(int) это указать на функцию которая возвращает инт и принимает в качестве параметра инт.
Цитата Сообщение от daslex Посмотреть сообщение
myfunc(P)
а тут ты передаешь указатель вместо инта wtf?
DU
1477 / 1053 / 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* и кастить его к нужной сигнатуре - то может
быть и выйдет.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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);
}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
07.01.2014, 23:08  [ТС]     Функция должна принять указатель на саму себя #5
outoftime, у меня CodeBlock ваш пример не компилирует, да и не понимаю я его.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
07.01.2014, 23:13     Функция должна принять указатель на саму себя #6
этот пример неверный как мне кажется.
если я правильно понял, то должен скомпилится вызов:
C++
1
myfunc(&myfunc);
так вот пример outoftime - это просто передача в одну функцию другого функтора (такое можно и без std::function сделать, но это не то, что нужно)

а не компиляться может из-за не поддержки c++11
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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);
}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
07.01.2014, 23:27  [ТС]     Функция должна принять указатель на саму себя #8
Цитата Сообщение от DU Посмотреть сообщение
myfunc(&myfunc);
вы правильно поняли.

Не по теме:

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

outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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 в данном случае шаблонная функция которая просто перевызывает функтор переданный ей в качестве аргумента.
DU
1477 / 1053 / 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;
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
07.01.2014, 23:53     Функция должна принять указатель на саму себя #11
DU, Это уже зависит от базы рекурсии.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
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 было не понимаю.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
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);
}
Лично у меня этот прикол падает (:
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
08.01.2014, 00:06  [ТС]     Функция должна принять указатель на саму себя #14
Могу ли? Не знаю как хорошо получится.
Должен быть указатель, который указывает на функцию.
Этот указатель должен быть передан вовнутрь функции как параметр.
Должен произойти вызов функции.

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

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

Добавлено через 2 минуты
http://www.newty.de/fpt/index.html что-то типа, жаль оформление не очень, но материал хороший
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
08.01.2014, 00:17     Функция должна принять указатель на саму себя #16
daslex, лови. Классика.

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
40
41
42
43
#include <stdio.h>
#include <windows.h>
 
 
//Эта херь и есть та самая функция, указатель на которую и ищем 
int osnovnaya_funktsia (int x) {
 printf ("привет, дуралеи!   %d\n", x); 
 getchar ();
 return 0;
}
 
//Так, а это объяаляем указатель на функцию, которая возврвщает переменную типа int и 
//прпнимат переменную типа int
int (*p)(int);
 
 
//А это вот и есть функция, параметр которой- указатель на другую функцию
//Вот её и будем вызывать
int prosto_funktsia (int(*p)(int), int x){
 p(x);
 return 0;
};
 
 
 
int main () {
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
 
 //Так тоже работает, странно это.
// p= &osnovnaya_funktsia;
 
p= osnovnaya_funktsia;
 prosto_funktsia (p, 6);
 
 prosto_funktsia (osnovnaya_funktsia, 7);
 
 
 
 getchar ();
 
 return 0;
}
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
08.01.2014, 00:23  [ТС]     Функция должна принять указатель на саму себя #17
В примере, который я показал что-то не так скорее всего.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
 
void func(void (*f)(void(*)()))
{
    static int i=10;
    i--;
    if (i==0) return;
    std::cout<<&f<<"\n";
  //f((f1)func);
 
   f((void(*)())func);
 
}
 
int main()
{
//   func((f2)func);
   func((void(*)(void(*)()))func);
}
если я правильно понял у чего брать адрес, то адрес не должен меняться, но он меняется.
хотя может я просто неправильно его смотрю.
=======================
outoftime, только с англ. я только со справочником и-то не всегда могу. Но спасибо.

Добавлено через 2 минуты
kravam, спасибо.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
08.01.2014, 00:32     Функция должна принять указатель на саму себя #18
Твой случай, похоже.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void myfunc () {
}
 
 
int prosto_funktsia (void (*p) ()){
 p();
 return 0;
};
 
 
 
int main () {
 void (*Ptr) ()= myfunc;
 prosto_funktsia (Ptr);
 return 0;
}
К ознакомлению.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
08.01.2014, 05:22     Функция должна принять указатель на саму себя #19
daslex, Sorry I have not finish configuring Ubuntu and can't write in Russian, but few years ago I was just like you.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2014, 11:45     Функция должна принять указатель на саму себя
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
08.01.2014, 11:45  [ТС]     Функция должна принять указатель на саму себя #20
kravam, не. это не решение.
в вашем примере (в обоих примерах) одна функция принимает указатель на другую функцию.
в моем "случае" одна функция должна принимать указатель на саму себя родную. Сама себя должна проглотить.
Yandex
Объявления
08.01.2014, 11:45     Функция должна принять указатель на саму себя
Ответ Создать тему
Опции темы

Текущее время: 21:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru