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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
nsl
1 / 1 / 0
Регистрация: 28.03.2011
Сообщений: 22
#1

В древности этим преподаватели якобы"убивали" зарвавшихся студентов - C++

15.12.2012, 12:34. Просмотров 1191. Ответов 28
Метки нет (Все метки)

Мне рассказали историю, что этот вопрос валил студентов напрочь

"напишите прототип функции, принимающей в качестве одного из своих аргументов, указатель на такую же функцию"
Вопрос - это задание имеет смысл?
Можно ли его выполнить.
И в чем подвох?
Может это просто бессмыслица?

Так как мне в такой теоретической постановке ничего подобного делать не приходилось.
Подскажите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 12:34     В древности этим преподаватели якобы"убивали" зарвавшихся студентов
Посмотрите здесь:
C++ Обработка структур "Преподаватели"
что дальше? (программа вводит информацию из ведомости и печатает фамилии студентов, учащихся на "4". "5" и их процентное соотношение с другими) C++
Результаты сдачи экзамена группой из N сту-дентов находятся в массиве REZ. Подсчитать количество студентов, сдавших экзамен на "хорошо" и "отлично" C++
Не компилируется, ошибки: "отсутствует оператор, соответствующий этим операндам" C++
C++ "Отсутствует оператор >> соответствующий этим операндам" - в чем ошибка?
Ошибка: отсутствует оператор "<<", соответствующий этим операндам C++
Ошибка: отсутствует оператор "==", соответствующий этим операндам C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
15.12.2012, 13:07     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #2
Такой вариант пойдет? Только правда, эт приведет к переполнению стека, т.к. рекурсия не останавливается
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
typedef void (*FUNC)(void *);
void foo(void * f){
    std::cout<<"Call foo\n";
    ((FUNC)f)(f);
}
int main(){
    foo(foo);
    return 0;
}

Не по теме:

И что значит в древности? В XII-веке?

WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
15.12.2012, 13:13     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #3
Имхо, смысла не имеет, хотя написать можно.
Т.к. написание таких функций предполагает либо написание бесконечного количества таких функций, либо им придется вызывать друг друга (либо себя), либо однажды передать 0 и обработать это.

Все варианты ведут либо к переполнению стека, либо к нарушению доступа, либо к бессмысленности таковой функи (вернее такого прототипа).
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.12.2012, 13:27     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #4
Прототип такой функции написать нельзя.
MrGluck
15.12.2012, 13:29
  #5

Не по теме:

за такие вопросы можно и канделябром по голове)

WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
15.12.2012, 13:34     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #6
Toshkarik,
Точняк, просто писать бесконечно придется. Попался я
MrGluck
Модератор
Эксперт CЭксперт С++
7156 / 4322 / 630
Регистрация: 29.11.2010
Сообщений: 11,741
15.12.2012, 13:34     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #7
Croessmah, у меня ваш код выдает
error: invalid conversion from 'void (*)(void*)' to 'void*' [-fpermissive]
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
15.12.2012, 13:41     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #8
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
struct fact {
    unsigned (*self)(unsigned, struct fact);
};
 
unsigned fact(unsigned n, struct fact inner)
{
    if (n <= 1) {
        return 1;
    }
    else {
        return n * inner.self(n - 1, inner);
    }
}
 
int main(void)
{
    printf("%d", fact(10, (struct fact){fact}));
}
Чтобы прямо так написать, не думаю, что получится. Рекурсивные типы можно только из структурок клепать в Си.
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
15.12.2012, 13:41     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #9
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
 
int func(void * f)
{
    std::cout<<"Fi";
    return ((int(*)(void*))f)(func);
}
 
int main()
{
    func(func);
    return 0;
}
VS2012 работает и падает
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
15.12.2012, 13:48     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #10
Цитата Сообщение от MrGluck Посмотреть сообщение
Croessmah, у меня ваш код выдает
error: invalid conversion from 'void (*)(void*)' to 'void*' [-fpermissive]
В древности этим преподаватели якобы"убивали" зарвавшихся студентов
В студии ситуация такая же.
Только код немного поменял - забыл привести указатель к void*
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
typedef void (*FUNC)(void *);
void foo(void * f){
    void (*g)(void *);
    std::cout<<"Call foo\n";
    reinterpret_cast<FUNC>(f)(f);
}
int main(){
    foo(reinterpret_cast<void*>(foo));
    return 0;
}
MrGluck
Модератор
Эксперт CЭксперт С++
7156 / 4322 / 630
Регистрация: 29.11.2010
Сообщений: 11,741
15.12.2012, 13:52     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #11
Croessmah, а у меня лишь вечный цикл (MinGW)
В древности этим преподаватели якобы"убивали" зарвавшихся студентов
MrGluck
Модератор
Эксперт CЭксперт С++
7156 / 4322 / 630
Регистрация: 29.11.2010
Сообщений: 11,741
15.12.2012, 13:55     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #12
WhiteP,
D:\My works in C++\123.cpp||In function 'int func(void*)':|
D:\My works in C++\123.cpp|7|warning: ISO C++ forbids casting between pointer-to-function and pointer-to-object [enabled by default]|
D:\My works in C++\123.cpp|7|error: invalid conversion from 'int (*)(void*)' to 'void*' [-fpermissive]|
D:\My works in C++\123.cpp||In function 'int main()':|
D:\My works in C++\123.cpp|12|error: invalid conversion from 'int (*)(void*)' to 'void*' [-fpermissive]|
||=== Build finished: 2 errors, 1 warnings ===|
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
15.12.2012, 14:00     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #13
Цитата Сообщение от MrGluck Посмотреть сообщение
Croessmah, а у меня лишь вечный цикл (MinGW)
Ну это же не цикл, это ж рекурсия =) Всё равно место закончится )))
Nick Alte
Эксперт С++
1608 / 1000 / 118
Регистрация: 27.09.2009
Сообщений: 1,930
Завершенные тесты: 1
15.12.2012, 14:12     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #14
При помощи класса-посредника можно написать функцию, принимающую указатель на себя или на функцию такого же типа, но не принимающую указатели других типов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class footype{
public:
   typedef void foofunc(footype);
   footype(foofunc* f): fptr(f) {}
   operator foofunc*() const {return fptr;}
private:
   foofunc* const fptr;
};
 
void foo(footype)
{
}
 
int main()
{
   foo(foo);
}
nsl
1 / 1 / 0
Регистрация: 28.03.2011
Сообщений: 22
15.12.2012, 17:27  [ТС]     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #15
Цитата Сообщение от MrGluck Посмотреть сообщение

Не по теме:

за такие вопросы можно и канделябром по голове)

Нужно ;-)

Добавлено через 4 минуты
Всем большое спасибо. Смысл мне понятен. Задание бессмысленно, так как не имеет практического применения и решения. Преподаватель просто издевался. Но написать можно , что бы посмотреть как все рухнет :-)
наверняка в реальном коде это можно решить по другому.
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
15.12.2012, 17:47     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #16
Цитата Сообщение от nsl Посмотреть сообщение
Но написать можно , что бы посмотреть как все рухнет :-)
В смысле рухнет?
nsl
1 / 1 / 0
Регистрация: 28.03.2011
Сообщений: 22
15.12.2012, 18:13  [ТС]     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #17
Цитата Сообщение от Croessmah Посмотреть сообщение
В смысле рухнет?
Зациклится, уйдет в период, зависнет. Из обсуждения я понял так.
Я просто ни разу не сталкивался. Но подозревал бессмысленность затеи. Типа как померить бесконечность в миллиметрах :-)
Croessmah
Модератор
Эксперт CЭксперт С++
13045 / 7308 / 814
Регистрация: 27.09.2012
Сообщений: 18,041
Записей в блоге: 3
Завершенные тесты: 1
15.12.2012, 18:14     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #18
Цитата Сообщение от nsl Посмотреть сообщение
Зациклится, уйдет в период, зависнет.
Ну так никто не мешает сделать условие выхода, чтобы не зациклилось ничего.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
15.12.2012, 18:14     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #19
Именно по Вашему заданию - нельзя вообще написать такой прототип.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 18:21     В древности этим преподаватели якобы"убивали" зарвавшихся студентов
Еще ссылки по теме:
C++ Ошибка: отсутствует оператор ">>", соответствующий этим операндам типы операндов: std::is
C++ Отсутствует оператор "==", соответствующий этим операндам
Отсутствует оператор ">>", соответствующий этим операндам C++
C++ При переворачивании массивов выходят такие цифры: "-858993469". Как с этим бороться?
Нужна программа "Журнал посещения учеников/студентов/работников" C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.12.2012, 18:21     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #20
Цитата Сообщение от nsl Посмотреть сообщение
"напишите прототип функции, принимающей в качестве одного из своих аргументов, указатель на такую же функцию"
Словосочетание "русский язык" само вполне русское.

Добавлено через 2 минуты
Цитата Сообщение от WhiteP Посмотреть сообщение
Все варианты ведут либо к переполнению стека, либо к нарушению доступа, либо к бессмысленности таковой функи (вернее такого прототипа).
Разве? Во-первых почитай ка про рекурсию. Во-вторых очередной параметр может быть NULL. В третьих по параметру не обязательно вызывать, он может использоваться в одной ветви, а исполнение пойти по другой.

Добавлено через 2 минуты
Цитата Сообщение от nsl Посмотреть сообщение
наверняка в реальном коде это можно решить по другому.
Можно. А можно и по-индусски написать вполне осмысленную прогу.

Добавлено через 43 секунды
Цитата Сообщение от nsl Посмотреть сообщение
Преподаватель просто издевался.
Нет. Он просто ищет среди своих учеников будущего хакера.
Yandex
Объявления
15.12.2012, 18:21     В древности этим преподаватели якобы"убивали" зарвавшихся студентов
Ответ Создать тему
Опции темы

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