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

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

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

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

07.01.2014, 22:48. Просмотров 1224. Ответов 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
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
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;
}
1
daslex
1280 / 524 / 107
Регистрация: 02.08.2011
Сообщений: 2,739
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, спасибо.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
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;
}
К ознакомлению.
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
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.
0
daslex
1280 / 524 / 107
Регистрация: 02.08.2011
Сообщений: 2,739
08.01.2014, 11:45  [ТС] #20
kravam, не. это не решение.
в вашем примере (в обоих примерах) одна функция принимает указатель на другую функцию.
в моем "случае" одна функция должна принимать указатель на саму себя родную. Сама себя должна проглотить.
0
kravam
быдлокодер
1700 / 887 / 45
Регистрация: 04.06.2008
Сообщений: 5,494
08.01.2014, 20:03 #21
Чуть подумав, понимаешь, что этого не может быть потому, что этого не может быть никогда. Разве что обмануть компилятор. Но смысл?
0
hoggy
6672 / 2856 / 491
Регистрация: 15.11.2014
Сообщений: 6,378
Завершенные тесты: 1
21.09.2015, 17:20 #22
http://rextester.com/SBI46430

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
#include <iostream>
#include <functional>
 
void foo(const struct myself& f, const size_t depth);
 
struct myself
{
    template<class T> myself(T&& v)
        :mCaller( std::bind(foo, foo, std::placeholders::_1) )
    {}
    
    void operator()(const size_t depth)const 
        { mCaller(depth); }
    
    std::function<void(const size_t)> 
        mCaller;
};
 
void foo(const myself& f, const size_t depth)
{
    if(depth == 0)
        return;
    
    std::cout<<"depth recursieve: "<< depth << '\n';
    f(depth - 1);
}
 
int main()
{
    std::cout << "Hello, world!\n";
    
    foo(foo, 10);
}
2
daslex
1280 / 524 / 107
Регистрация: 02.08.2011
Сообщений: 2,739
21.09.2015, 17:34  [ТС] #23
Как бы я в этом коде ничего не понял. Небольшие разъяснения наиболее важных участков могут оказаться полезны не только мне.
Цитата Сообщение от hoggy Посмотреть сообщение
foo(foo, 10);
Вовнутрь функции передается функция., а должен был указатель на неё. Т.е. созданный указатель, который указывает на foo должен был передаться вовнутрь foo., а не foo вовнутрь foo.
0
Croessmah
Эксперт CЭксперт С++
13514 / 7672 / 866
Регистрация: 27.09.2012
Сообщений: 18,891
Записей в блоге: 3
Завершенные тесты: 1
21.09.2015, 17:41 #24
daslex, это не реализуемо

Добавлено через 1 минуту
В древности этим преподаватели якобы"убивали" зарвавшихся студентов
2
daslex
1280 / 524 / 107
Регистрация: 02.08.2011
Сообщений: 2,739
21.09.2015, 17:42  [ТС] #25
Croessmah, мне не верят. Я в курсе.
0
Croessmah
Эксперт CЭксперт С++
13514 / 7672 / 866
Регистрация: 27.09.2012
Сообщений: 18,891
Записей в блоге: 3
Завершенные тесты: 1
21.09.2015, 17:42 #26
Цитата Сообщение от daslex Посмотреть сообщение
мне не верят.
ну пусть покажут как, посмотрим.
1
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
21.09.2015, 18:23 #27
daslex,
Без хаков с приведением типов и используя лишь функции С++ это не реализуемо. Концептуально.
По очень простой причине. Функции в С++ не объекты первого класса. В этом нет ничего удивительного, т.к. концепция функции унаследована из С, который не задумывался как объектно-ориентированный язык.
Зато С++ предоставляет альтернативный механизм - функторы.
Функторы - это функциональные объекты, и они являются объектами первого класса. Поэтому такой код в С++ будет работать и в какой-то степени решает поставленную задачу:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Func
{
    void operator()(Func & func, int i = 0)
    {
        if(i < 10) // чтобы разорвать рекурсию.
        {
            func(*this, i + 1);
        }
    }
};
 
 
int main()
{
    Func f;
    
    f(f);
}
1
daslex
21.09.2015, 18:27  [ТС]
  #28

Не по теме:

Да мне не надо это доказывать. Эта тема воскресла потому как я дал на нее ссылку из другой темы. Я имел наглость заявить, что С++ умеет не всё и мне, разумеется, никто не поверил. Эта тема под руку попалась как одна из небольшого множества нерешаемых задач, которые я видел и которую я смог вспомнить.

0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
21.09.2015, 18:40 #29
Цитата Сообщение от daslex Посмотреть сообщение
мне не верят.
Не верят потому, что ты неправильно возражаешь.
Тут нужна железная аргументация, а не попытки холиварить
Многие, кто с тобой спорит, на самом деле знают, что этого сделать в чистом виде нельзя.
Но из-за слабой аргументации с твоей стороны, не могут себе позволить просто так сдаться.
Например, в соседней теме ты категорически не прав, приплетая boost, как доказательство того, что С++ чего-то не может. Вот этот пример, с функцией - доказательство. Слабое, т.к. есть эмулирующие механизмы, но это не важно, факт есть факт - нельзя.
А вот boost и вообще библиотеки на С++ - это не в кассу. Знаешь почему? Потому что любой плюсовик знает, что концепция языка закладывалась с тем расчетом, чтобы получить относительно маленькое ядро языка, но которое позволяет с помощью своих возможностей реализовать практически любую функциональность. Почитай Страуструпа. Они в комитете иногда намеренно не вносили изменения в стандарт. Потому что было известно, что это хорошо реализуется на уровне библиотеки. Да, черт возьми, библиотека iostreams отдельно от языка - это намеренное опровержение от Страуструпа утверждения, что якобы нельзя сделать эффективную библиотеку ввода-вывода вне ядра языка.
Поэтому приводя аргументом boost, ты вызываешь когнитивный диссонанс. Не может средству, которое задумывалось как "набор инструментов, чтобы построить почти любой дом" вменяться в вину, что оно выполняет свое прямое назначение. Это нонсенс.
Почитай "Дизайн и Эволюцию". Хочешь воевать на этом поле - изучай материал. Наехать на С++ можно. У него много изъянов, но надо знать язык, чтобы в них попадать.

Добавлено через 1 минуту
Цитата Сообщение от daslex Посмотреть сообщение
Да мне не надо это доказывать.
Господи, да выключи уже самолюбие и слушай.
Я не доказываю тебе ничего. Я тебе расставляю точки над i.
Чтобы ты знал куда давить в таких спорах. Об образовании твоем забочусь, между прочим
4
daslex
1280 / 524 / 107
Регистрация: 02.08.2011
Сообщений: 2,739
21.09.2015, 18:46  [ТС] #30
Пусть с boost я категорически не прав. От boost я перешел к WinApi. Смысл абсолютно тот же самый, когда я сослался на Boost. Всё из этой же оперы почему я на него сослался.
Но об этом всем надо в той теме писать. Тут по этой, там по той.

Возражаю как умею.
0
21.09.2015, 18:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2015, 18:46
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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