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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
nsl
1 / 1 / 0
Регистрация: 28.03.2011
Сообщений: 22
15.12.2012, 12:34     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #1
Мне рассказали историю, что этот вопрос валил студентов напрочь

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

Так как мне в такой теоретической постановке ничего подобного делать не приходилось.
Подскажите пожалуйста.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.12.2012, 12:34     В древности этим преподаватели якобы"убивали" зарвавшихся студентов
Посмотрите здесь:

Результаты сдачи экзамена группой из N сту-дентов находятся в массиве REZ. Подсчитать количество студентов, сдавших экзамен на "хорошо" и "отлично" C++
что дальше? (программа вводит информацию из ведомости и печатает фамилии студентов, учащихся на "4". "5" и их процентное соотношение с другими) C++
C++ Структура: Вывести тех студентов, кто сдал оба экзамена либо на "4" либо на "5"
Разработать класс "зачетная книжка", содержащий информацию об успеваемости студентов C++
C++ При переворачивании массивов выходят такие цифры: "-858993469". Как с этим бороться?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 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
604 / 202 / 23
Регистрация: 20.11.2012
Сообщений: 419
15.12.2012, 13:13     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #3
Имхо, смысла не имеет, хотя написать можно.
Т.к. написание таких функций предполагает либо написание бесконечного количества таких функций, либо им придется вызывать друг друга (либо себя), либо однажды передать 0 и обработать это.

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

Не по теме:

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

WhiteP
604 / 202 / 23
Регистрация: 20.11.2012
Сообщений: 419
15.12.2012, 13:34     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #6
Toshkarik,
Точняк, просто писать бесконечно придется. Попался я
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
15.12.2012, 13:34     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #7
Croessmah, у меня ваш код выдает
error: invalid conversion from 'void (*)(void*)' to 'void*' [-fpermissive]
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 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
604 / 202 / 23
Регистрация: 20.11.2012
Сообщений: 419
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
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 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
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
15.12.2012, 13:52     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #11
Croessmah, а у меня лишь вечный цикл (MinGW)
В древности этим преподаватели якобы"убивали" зарвавшихся студентов
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
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
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
15.12.2012, 14:00     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #13
Цитата Сообщение от MrGluck Посмотреть сообщение
Croessmah, а у меня лишь вечный цикл (MinGW)
Ну это же не цикл, это ж рекурсия =) Всё равно место закончится )))
Nick Alte
Эксперт С++
1561 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,896
Завершенные тесты: 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
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
15.12.2012, 17:47     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #16
Цитата Сообщение от nsl Посмотреть сообщение
Но написать можно , что бы посмотреть как все рухнет :-)
В смысле рухнет?
nsl
1 / 1 / 0
Регистрация: 28.03.2011
Сообщений: 22
15.12.2012, 18:13  [ТС]     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #17
Цитата Сообщение от Croessmah Посмотреть сообщение
В смысле рухнет?
Зациклится, уйдет в период, зависнет. Из обсуждения я понял так.
Я просто ни разу не сталкивался. Но подозревал бессмысленность затеи. Типа как померить бесконечность в миллиметрах :-)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
15.12.2012, 18:14     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #18
Цитата Сообщение от nsl Посмотреть сообщение
Зациклится, уйдет в период, зависнет.
Ну так никто не мешает сделать условие выхода, чтобы не зациклилось ничего.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
15.12.2012, 18:14     В древности этим преподаватели якобы"убивали" зарвавшихся студентов #19
Именно по Вашему заданию - нельзя вообще написать такой прототип.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 18:21     В древности этим преподаватели якобы"убивали" зарвавшихся студентов
Еще ссылки по теме:

C++ Распечатать анкетные данные студентов, получивших на последней сессии оценки "2".
C++ Структура "Студент", найти студентов с оценкой 4 и 5
Ошибка: отсутствует оператор "<<", соответствующий этим операндам C++

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для 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     В древности этим преподаватели якобы"убивали" зарвавшихся студентов
Ответ Создать тему
Опции темы

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