Страница 1 из 3
zagadka
Добавлено: 09 янв 2004, 16:33
temp
[trn]pismennyj test dlja [/trn]junior developers. [trn]odin iz voprosov - realizovat' funkciju, kotoraja delaet nechto opredelennoe. imeem sledujushij otvet [/trn]-
Код: Выделить всё
struct s
{
...
int a;
};
struct s * func(int * a_ptr)
{
if (*a_ptr > 0)
return *func(*a_ptr-1);
if (*a_ptr < 0)
return *func(*a_ptr+1);
else
return 0;
}
[trn]ne obrashchaja vnimanija na sintaksicheskie oshibki i prochie melochi, predlagaetsja ugadat', chto imenno dolzhna byla delat' [/trn]func()
Re: zagadka
Добавлено: 09 янв 2004, 16:42
Woozy
Вроде эта функция могла бы возвратить NULL указатель на структуру, если бы только работала.
Но на практике она вовсе не обязательно успешно завершается. Даже проверять компиллятором не хочу, но вот это: return *func для функции func что возвращает указатель - не компиллируется.
То есть не работает функция вовсе, по причине неправильности.
====================
Помимо того, эта чепуха, будь она компилиируемой, может попытаться читать по неправильному адресу, что приводит к печальным последствиям, как memory access fault exception.
Добавлено: 09 янв 2004, 17:16
vg
Кроме той ошибки, о которой ты говоришь
return *func для функции func
(по-русски говоря пытаются вернуть структуру, тогда как следует возвращать указательна на структуру) там ещё одна ошибка, когда в параметрах рекурсивного вызова передают целое значение вместо указателя на целое - func (*a_prt ...).
Добавлено: 09 янв 2004, 19:31
Woozy
vg писал(а):
Кроме той ошибки, о которой ты говоришь
Это и имелось в виду.
Одним словом, гадать что функция вернёт - не имеет смысла.
Добавлено: 09 янв 2004, 21:57
vg
Думаю, будет справедливым, если автор топика подкинет наводящие вопросы.
Добавлено: 10 янв 2004, 09:48
Marmot
signum?
Re: zagadka
Добавлено: 12 янв 2004, 11:26
MarkM
temp писал(а):[trn]ne obrashchaja vnimanija na sintaksicheskie oshibki i prochie melochi, predlagaetsja ugadat', chto imenno dolzhna byla delat' [/trn]func()
[trn]
Funkcija dolzhna recursivno vyzyvat' sama sebja abs(N)-1 raz. V itoge kogda parametr stanet 0, funkcija vernetsja.
[/trn]
Добавлено: 12 янв 2004, 18:04
vg
temp:
не обращая внимания на синтаксические ошибки и прочие мелочи, предлагается угадать, что именно должна была делать func()
Функция должна рецурсивно вызывать сама себя абс(Н)-1 раз. В итоге когда параметр станет 0, функция вернется.
По крайней мере логично ( что менеджер задал такой вопрос джуниору). Лично мне вообще ничего не приходит на ум.
Добавлено: 13 янв 2004, 07:36
MarkM
[quote="vg]
По крайней мере логично ( что менеджер задал такой вопрос джуниору). Лично мне вообще ничего не приходит на ум.[/quote]
[trn]
Cel' dannogo zadanija, ponjat' kak ekzamenuemyj ponimaet logiku raboty programmy, kak abstagiruetsja ot melochej i sintaksicheskih oshibok. T.e. vidit li on les za derevjami.
PS. Dlja proverki sintaksisa est' kompiljator. A vot logiku mozhet ponjat' tol'ko chelovek. No ne kazhdyj.

[/trn]
Добавлено: 13 янв 2004, 13:18
temp
[trn]vnimanie, pravil'nyj otvet

[/trn]
func() [trn]vozvrashaet ukazatel' na strukturu po ukazatelju na ee pole [/trn]
a[trn]. wto mozhno bylo v principe ponjat' iz togo chto (a) vopros [/trn]entry-level[trn] (b) parameter nazyvaetsja[/trn] a_ptr [trn]i vozvrashchaetsja ukazatel' na strukturu. chto eshche mozhno sdelat' s pointerom, ne znaja detalej struktury krome imeni odnogo polja? (vopros ritoricheskij)[/trn]
Код: Выделить всё
void sample()
{
struct s tmp;
assert(&tmp == func(&tmp.a));
}
Добавлено: 13 янв 2004, 13:28
temp
MarkM писал(а):
[trn]
Cel' dannogo zadanija, ponjat' kak ekzamenuemyj ponimaet logiku raboty programmy, kak abstagiruetsja ot melochej i sintaksicheskih oshibok. T.e. vidit li on les za derevjami.
[/trn]
[trn]pozvol'te vam, tovarishch, posovetovat' perechitat' original'nyj vopros.
wto obratnaja zadacha, tak skazat' - po redkostno krivomu otvetu kandidata nado vosstanovit' original'nyj vopros

[/trn]
Добавлено: 13 янв 2004, 13:47
Marmot
temp писал(а):[trn]vnimanie, pravil'nyj otvet

[/trn]
func() [trn]vozvrashaet ukazatel' na strukturu po ukazatelju na ee pole [/trn]
a[trn]. wto mozhno bylo v principe ponjat' iz togo chto (a) vopros [/trn]entry-level[trn] (b) parameter nazyvaetsja[/trn] a_ptr [trn]i vozvrashchaetsja ukazatel' na strukturu. chto eshche mozhno sdelat' s pointerom, ne znaja detalej struktury krome imeni odnogo polja? (vopros ritoricheskij)[/trn]
Код: Выделить всё
void sample()
{
struct s tmp;
assert(&tmp == func(&tmp.a));
}
А мне, например, это неочевидно, глупый я наверное...
Хотя жизнь пока убеждает в обратном.
А придурочные junior developers иногда такую туфту гонят...
Так что, вопрос был некорректный, имхо.
Добавлено: 13 янв 2004, 15:09
vg
2 temp,
внимание, правильный ответ
func() возврашает указатель на структуру по указателю на ее поле a. это можно было в принципе понять из того что (а) вопрос entry-level (б) параметер называется a_ptr и возвращается указатель на структуру.
1)
внимание, был
неправильный ответ (имею ввиду Вас, товарищЪ)
Дело в том, что в том коде, который Вы привели:
адрес s.a
никогда не равен адресу s. Для вычисления адреса s по значению адреса s.a необходимо знать смещение a в s. В Вашем примере это невозможно сделать, поскольку многоточие в структуре стоит перед int a.
Это наталкивает меня на очень грустные мысли ( от кошмаров я уже отдохнул ). Думаю, что Вы были возбуждены также, как и джуниор, когда Вы задавали ему свой вопрос.
2Marmot,
Хотя жизнь пока убеждает в обратном.
Ах...
А придурочные junior developers иногда такую туфту гонят...
Вы, Мармот, сами говорили, что работали преподавателем. Тем более некоректно так говорить о джуниорах, имхо ("придурошные").
Так что, вопрос был некорректный, имхо.
Согласен. Но, не то чтобы некоректно. Здесь временный тестер людских голов показал нечто другое.
2MarkM,
Для проверки синтаксиса есть компилятор.
Вот ведь как!!! А я думал для изготовления исполняемого (выполнимого) кода

Добавлено: 13 янв 2004, 15:22
Woozy
vg писал(а):адрес s.a никогда не равен адресу s.
Запросто, если a - первый члена в структуре, смещение - 0.
Чепуха эта функция. Логически анализировать даже не стоит. Уже наприкалывались.

Добавлено: 13 янв 2004, 15:52
vg
2 Woozy,
Запросто, если a - первый члена в структуре, смещение - 0.
1) Woozy, listen to me... No offence, But ... очень невнимательно читаешь мои постинги. Я постил, что в примере "временщика" это невозможно сделать, т.к. многоточие у него стоит
перед int a. Стало быть - определить смещение не представляется возможным.
2) Тоже про твоё "запросто". Такие вопросы джуниору вообще не следует задавать, имхо. Связано это с тем, что в реальных задачах в зависимости от опций копмиллера (в части выравнивания структур по 32-битной границе) ты можешь получить разные значения смещения в
массивах таких структур (если будешь использовать макро для смещения в виде
констант). Но, похоже кое-кто в этом - вообще не бум-бум (я не о тебе).