С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Обработка структур "Преподаватели" - C++
Создать структуру, которая состоит из следующих полей: факультет (основное место работы преподавателя), фамилия преподавателя, группа, с...

что дальше? (программа вводит информацию из ведомости и печатает фамилии студентов, учащихся на "4". "5" и их процентное соотношение с другими) - C++
Ведомость о результатах зимней сессии содержит информацию: фамилия и инициалы студента, номер группы, оценки с 3-х предметов: а)...

Класс "Студент", реализовать динамический список "Группа студентов" - C++
реализовать динамический список " группа студентов". Узел: -группа -фамилия Функции списка: -добавление по алфавиту ...

Результаты сдачи экзамена группой из N сту-дентов находятся в массиве REZ. Подсчитать количество студентов, сдавших экзамен на "хорошо" и "отлично" - C++
Задача 68. Результаты сдачи экзамена группой из N сту-дентов находятся в массиве REZ. Подсчитать количество студентов, сдавших экзамен на...

Структура: Вывести тех студентов, кто сдал оба экзамена либо на "4" либо на "5" - C++
Условие задачи: Дана ведомость студентов: Фамилия студента, оценка_1, оценка_2. Вывести тех студентов, кто сдал оба экзамена либо на...

28
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 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-веке?

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

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

Не по теме:

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

0
WhiteP
606 / 204 / 23
Регистрация: 20.11.2012
Сообщений: 426
15.12.2012, 13:34 #6
Toshkarik,
Точняк, просто писать бесконечно придется. Попался я
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,634
15.12.2012, 13:34 #7
Croessmah, у меня ваш код выдает
error: invalid conversion from 'void (*)(void*)' to 'void*' [-fpermissive]
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 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}));
}
Чтобы прямо так написать, не думаю, что получится. Рекурсивные типы можно только из структурок клепать в Си.
1
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 работает и падает
1
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 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;
}
1
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,634
15.12.2012, 13:52 #11
Croessmah, а у меня лишь вечный цикл (MinGW)
В древности этим преподаватели якобы"убивали" зарвавшихся студентов
0
MrGluck
Модератор
Эксперт CЭксперт С++
7498 / 4614 / 694
Регистрация: 29.11.2010
Сообщений: 12,634
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 ===|
0
Croessmah
Ушел
Эксперт CЭксперт С++
13558 / 7708 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
15.12.2012, 14:00 #13
Цитата Сообщение от MrGluck Посмотреть сообщение
Croessmah, а у меня лишь вечный цикл (MinGW)
Ну это же не цикл, это ж рекурсия =) Всё равно место закончится )))
0
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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);
}
2
nsl
1 / 1 / 0
Регистрация: 28.03.2011
Сообщений: 22
15.12.2012, 17:27  [ТС] #15
Цитата Сообщение от MrGluck Посмотреть сообщение

Не по теме:

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

Нужно ;-)

Добавлено через 4 минуты
Всем большое спасибо. Смысл мне понятен. Задание бессмысленно, так как не имеет практического применения и решения. Преподаватель просто издевался. Но написать можно , что бы посмотреть как все рухнет :-)
наверняка в реальном коде это можно решить по другому.
0
15.12.2012, 17:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2012, 17:27
Привет! Вот еще темы с ответами:

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

Не компилируется, ошибки: "отсутствует оператор, соответствующий этим операндам" - C++
Помогите исправить ошибку, данные проект создавался в среде eclipse при переносе на VS 2010 стал выдавать ошибки при компиляции. Исправьте...

"Отсутствует оператор >> соответствующий этим операндам" - в чем ошибка? - C++
в книге приводится пример. main (){ string a=&quot; &quot;; string b; while (cin&gt;&gt;b) { if (a==b){ cout&lt;&lt;&quot;Повторяющееся слово...

Ошибка: отсутствует оператор "<<", соответствующий этим операндам - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;windows.h&gt; #include &lt;conio.h&gt; struct Student //объявляем...


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

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

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