HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Задачка на сообразительность
По С/С++
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Хитрота Задачка на сообразительность

Задачка старая, и очень простая на первый взгляд.

1) Требуется написать корректный и переносимый код на языке С: функция foo, единственное предназначение которой - возврат указателя на саму себя. Иными словами, вот такой код должен компилироваться, работать и соответствовать стандарту:

C++ Source Code:
foo_t pf = foo(); // вызов foo
pf(); // вызов foo


2) То же, но на языке С++.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 158032

Старое сообщение 13-08-2016 15:44
-
ComradeAndrew
Житель форума

Дата регистрации: Aug 2014
Проживает: Дубай
Сообщений: 510
Возраст: 27

Рейтинг



XaeroX
1)

C++ Source Code:
1
typedef void* (*foo_t)();
2
 
3
void* foo() {
4
  return foo;
5
}
6
 
7
int main()
8
{
9
  foo_t pf = foo(); // вызов foo
10
  pf(); // вызов foo
11
}


2) На c++ чем-то сильно отличается?

Сообщить модератору | | IP: Записан
Сообщение: 158061

Старое сообщение 14-08-2016 05:55
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


ComradeAndrew
Это очевидный вариант, но он в общем случае неверный.
Кто тебе сказал, что sizeof(void*) равен sizeof(foo_t)?

Добавлено 14-08-2016 в 13:18:

Цитата:
ComradeAndrew писал:
На c++ чем-то сильно отличается?

Ну как минимум твой код в с++ не скомпилируется, потому что там нет приведения от void* по умолчанию.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 158063

Старое сообщение 14-08-2016 06:18
-
ComradeAndrew
Житель форума

Дата регистрации: Aug 2014
Проживает: Дубай
Сообщений: 510
Возраст: 27

Рейтинг



Цитата:
XaeroX писал:
Ну как минимум твой код в с++ не скомпилируется, потому что там нет приведения от void* по умолчанию.

Это в стандарте так описано или ещё какие-то компиляторы так делают? У меня-то собирается.
Задача именно в том, чтобы все было по стандарту или работало на компиляторах всех платформ?
Цитата:
XaeroX писал:
sizeof(void*) равен sizeof(foo_t)

Может быть иначе? Не представляю при каких условиях.

Добавлено 14-08-2016 в 09:41:

Допустим такой код исправляет то о чем ты говоришь? Или я каких-то принципиальных моментов задачи не понимаю?
C++ Source Code:
foo_t foo() {
  return foo;
}

Сообщить модератору | | IP: Записан
Сообщение: 158064

Старое сообщение 14-08-2016 06:41
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
ComradeAndrew писал:
Это в стандарте так описано или ещё какие-то компиляторы так делают? У меня-то собирается.

Why must I use a cast to convert from void*?
Цитата:
ComradeAndrew писал:
Может быть иначе? Не представляю при каких условиях.

Гм. Ну я тоже не представляю, при каких условиях int может быть не четырёхбайтовым, а в байте может быть не 8 битов. Но переносимый код должен учитывать, что стандарт описывает не всё, и кое-какие вещи остаются на усмотрение разработчика компилятора.
Цитата:
ComradeAndrew писал:
Допустим такой код исправляет то о чем ты говоришь?

Зависит от того, как ты определил foo_t.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 158067

Старое сообщение 14-08-2016 07:29
-
ComradeAndrew
Житель форума

Дата регистрации: Aug 2014
Проживает: Дубай
Сообщений: 510
Возраст: 27

Рейтинг



Цитата:
XaeroX писал:
Why must I use a cast to convert from void*?

Там ведь показаны примеры кастов в разные типы. А тут-то: foo_t -> void* -> foo_t
Разве не безопасно?

Сообщить модератору | | IP: Записан
Сообщение: 158068

Старое сообщение 14-08-2016 07:41
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


ComradeAndrew
Безопасно. Но компилятор об этом не знает. Foo может быть определена вообще в другой единице трансляции.

Добавлено 14-08-2016 в 15:17:

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

__________________

Сообщить модератору | | IP: Записан
Сообщение: 158069

Старое сообщение 14-08-2016 08:17
-
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


Мух-ха-ха

Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.

Сообщить модератору | | IP: Записан
Сообщение: 158071

Старое сообщение 14-08-2016 08:54
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Government-Man

Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.

А теперь для С...

__________________

Сообщить модератору | | IP: Записан
Сообщение: 158072

Старое сообщение 14-08-2016 09:19
-
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.

Сообщить модератору | | IP: Записан
Сообщение: 158073

Старое сообщение 14-08-2016 09:29
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Government-Man

Скрытый текст:
Этот текст скрытый. Вы должны оставить хотя бы одно сообщение в теме, чтобы его увидеть.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 158074

Старое сообщение 14-08-2016 09:32
-
nemyax
Нёмыч

Дата регистрации: Jul 2011
Проживает: (void)
Сообщений: 4136

Рейтинг



Цитата:
XaeroX писал:
функция foo, единственное предназначение которой - возврат указателя на саму себя

Пригодиться такое может, или это чисто упражнение на повозиться?

Сообщить модератору | | IP: Записан
Сообщение: 158075

Старое сообщение 14-08-2016 09:38
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


nemyax
Ну если функция будет ещё что-то делать - то вполне может пригодиться.
Например, если это цепочка функций для конечного автомата, где иногда надо несколько раз вызвать одну и ту же функцию, прежде чем двигаться дальше.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 158076

Старое сообщение 14-08-2016 09:53
-
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 32202
Нанёс повреждений: 392 ед.

Рейтинг



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

Добавлено 14-08-2016 в 14:23:

Цитата:
nemyax писал:
Пригодиться такое может, или это чисто упражнение на повозиться?

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

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | | IP: Записан
Сообщение: 158084

Старое сообщение 14-08-2016 11:23
-
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34510
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Цитата:
Дядя Миша писал:
давайте передавать указатель не на функцию, а на структуру, в которой указатель на функцию и рядом размер void в байтах.

Давайте. Напиши компилируемый код.
Цитата:
Дядя Миша писал:
Потому что у практических задач зачастую не существует правильного решения.

Я, кстати, не говорил, что у этой задачи есть правильное решение.

__________________

Сообщить модератору | | IP: Записан
Сообщение: 158088

Старое сообщение 14-08-2016 11:50
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 06:52. Новая тема    Ответить
Страницы (2): [1] 2 »   Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Задачка на сообразительность
По С/С++
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024