Форум программистов, компьютерный форум 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 не станет больше х)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
21.09.2015, 21:28     Функция должна принять указатель на саму себя #41
Цитата Сообщение от daslex Посмотреть сообщение
Всё, что в class мне неизвестно, следовательно непонятно в принципе.
на самом деле там ничего сложного и сверъестественного нет.

я мог бы вам объяснить, как работает такая магия.
но только если вы понимаете шаблоны хотя бы на базовом уровне.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
21.09.2015, 21:37  [ТС]     Функция должна принять указатель на саму себя #42
На базовом понимаю. Зачем они нужны тоже понимаю. Однозначно знаю не всю подноготную, но малая, вводная часть о шаблонах мне известна. Что Вы понимаете под базовым уровнем не очень понимаю. Понятие базовых знаний у людей обычно отличается. Как они там делают "большое пузо" небольшим с виду кодам, например, плохо понимаю, только в общих чертах.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
21.09.2015, 22:11     Функция должна принять указатель на саму себя #43
Цитата Сообщение от daslex Посмотреть сообщение
На базовом понимаю. Зачем они нужны тоже понимаю. Однозначно знаю не всю подноготную, но малая, вводная часть о шаблонах мне известна. Что Вы понимаете под базовым уровнем не очень понимаю. Понятие базовых знаний у людей обычно отличается. Как они там делают "большое пузо" небольшим с виду кодам, например, плохо понимаю, только в общих чертах.
тогда поехали:

для начала отвлечемся от вашей задачи.
забудье на время обо всем, о чем мы с вами говорили прежде.
начнем с чистого листа.

предположим, есть неккий класс "кнопка".
и если на кнопку нажали - пусть она предупредит наш клиентский код об этом событии.

но проблема в том, что "кнопка" - это библиотечный класс, который ничего о нас не знает
как же она сможет прудепредить нас о нажатии, если она ничего о нас не знает?

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


вот так это может выглядеть в коде:

http://rextester.com/TSIWEX43141

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
#include <iostream>
#include <functional>
 
struct button
{
 
    typedef std::function<void()>
        callback;
    
    
    callback onPressed;
    
    
    void simulatePressed()
    {
        if(onPressed)
            onPressed();
    }
};
 
 
void if_pressed()
{
    std::cout<<"на кнопку нажали\n"; 
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    button b;
    b.onPressed = if_pressed;
    
    
    b.simulatePressed();
}
кнопка ничего о нас не знает.
но мы указали ей, что нужно дернуть,
что бы нас предупредить.


теперь следущий шаг:
вы наверное уже заметили,
что всю грязную работу на себя берет чудесный механизм std::function.

как он это делает?

концептуальная схема:
http://rextester.com/QXLF72730


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
44
45
46
47
48
49
50
51
#include <iostream>
 
 
// --- будем запускать её
int foo() { std::cout<< __PRETTY_FUNCTION__ << std::endl; return 0; }
 
 
// --- общий шаблон - не функционирует
// попытка вызвать его для абы какого T будет приводить
// к ошибкам компиляции
template<class T>struct delegate;
 
    
// --- специализация для случая, когда делегат
// это функция    
template<class R, class... Args>
struct delegate<R(Args...)>
{
    // из шаблона выводится тип функции
    // которую нужно запустить.
    typedef R(*pFunc)(Args...);
    
    
    // --- нацеливание делегата в конструкторе
    delegate( R foo(Args...)  )
        :mFunc(foo) 
    {} 
    
    R operator ()(Args&&... args)
    {
        // -- запуск функции
        return  mFunc( std::forward<Args>(args)...  );
    }
    
    pFunc mFunc;
};
 
 
int main()
{
    std::cout << "Hello, world!\n";
 
    
    // --- создаем делегат,
    // который нацелен на запуск функции foo
    delegate<int()> d = foo;
    
    // запускаем функцию foo опосредованно,
    // через делегат
    d();
}
в реальности делегаты учитывают множество самых различных нюансов,
что позволяет нацелить их куда угодно.
gng
605 / 451 / 122
Регистрация: 08.09.2013
Сообщений: 1,152
21.09.2015, 23:41     Функция должна принять указатель на саму себя #44
Цитата Сообщение от daslex Посмотреть сообщение
только как если бы без typedef было не понимаю.
Не в тайпдефе дело. Если подпереться самым мощным костылем С++, коим является наследованная от Си низкоуровневость, можно и без него.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
void f (void (*_f)(void*)) {
  static int n= 2;
  std::cout << n << std::endl;
  if (--n) _f ((void*)f);
}
 
int main() {
  void (*pf)(void(*)(void*))= f;
  pf ((void(*)(void*))f);
}
В самой сишке с типизацией еще проще. Как сказали бы педанты, ещё большее раздолбайство, так что и без явного приведения обошлось. (во всяком случае, gcc и clang предупреждений не пишут).
C
1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
void f (void (*_f)()) {
  static int n= 2;
  printf ("%d\n", n);
  if (--n) _f (f);
}
 
int main() {
  void (*pf)(void(*)())= f;
  pf (f);
}
Без приведения типов в рамках указателей на функцию, как вам уже пояснили, задачу решить невозможно. Но ИМХО, Си++ со строгой типизацией - это уже не Плюсы.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
21.09.2015, 23:50     Функция должна принять указатель на саму себя #45
Цитата Сообщение от gng Посмотреть сообщение
void (*pf)(void(*)(void*))= f;
daslex
1084 / 494 / 101
Регистрация: 02.08.2011
Сообщений: 2,408
22.09.2015, 00:11  [ТС]     Функция должна принять указатель на саму себя #46
gng, тому сообщению откуда выдрана цитата почти год уже)

Добавлено через 10 минут

Не по теме:

Я как бы сторонник версии, что у C/C++ возможности воистину безграничны, а непосредственно С++ - язык, который не способен пока что быть независимым, ибо ему периодически нужно костыли. Отсюда мое "С++ всего не может".

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2015, 00:21     Функция должна принять указатель на саму себя
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
gng
605 / 451 / 122
Регистрация: 08.09.2013
Сообщений: 1,152
22.09.2015, 00:21     Функция должна принять указатель на саму себя #47

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
gng, тому сообщению откуда выдрана цитата почти год уже)
Извиняюсь, просмотрел.



Добавлено через 3 минуты

Не по теме:

hoggy, В плюсах можно заменить

C++
1
auto pf= f;
В сишке такого пока нету :-((

Yandex
Объявления
22.09.2015, 00:21     Функция должна принять указатель на саму себя
Ответ Создать тему
Опции темы

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