zagadka

Все, что вы хотели знать о программизме, но боялись спросить.
temp
Частый Гость
Сообщения: 17
Зарегистрирован: 03 дек 2003, 15:14

zagadka

Сообщение 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()
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Re: zagadka

Сообщение Woozy »

Вроде эта функция могла бы возвратить NULL указатель на структуру, если бы только работала.

Но на практике она вовсе не обязательно успешно завершается. Даже проверять компиллятором не хочу, но вот это: return *func для функции func что возвращает указатель - не компиллируется.

То есть не работает функция вовсе, по причине неправильности.


====================
Помимо того, эта чепуха, будь она компилиируемой, может попытаться читать по неправильному адресу, что приводит к печальным последствиям, как memory access fault exception.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Кроме той ошибки, о которой ты говоришь
return *func для функции func
(по-русски говоря пытаются вернуть структуру, тогда как следует возвращать указательна на структуру) там ещё одна ошибка, когда в параметрах рекурсивного вызова передают целое значение вместо указателя на целое - func (*a_prt ...).
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

vg писал(а): Кроме той ошибки, о которой ты говоришь
Это и имелось в виду.

Одним словом, гадать что функция вернёт - не имеет смысла.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Думаю, будет справедливым, если автор топика подкинет наводящие вопросы.
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение Marmot »

signum?
MarkM
Пользователь
Сообщения: 113
Зарегистрирован: 24 сен 2003, 21:52

Re: zagadka

Сообщение 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]
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

temp:
не обращая внимания на синтаксические ошибки и прочие мелочи, предлагается угадать, что именно должна была делать func()


Функция должна рецурсивно вызывать сама себя абс(Н)-1 раз. В итоге когда параметр станет 0, функция вернется.
По крайней мере логично ( что менеджер задал такой вопрос джуниору). Лично мне вообще ничего не приходит на ум.
MarkM
Пользователь
Сообщения: 113
Зарегистрирован: 24 сен 2003, 21:52

Сообщение 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]
temp
Частый Гость
Сообщения: 17
Зарегистрирован: 03 дек 2003, 15:14

Сообщение 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));
}
temp
Частый Гость
Сообщения: 17
Зарегистрирован: 03 дек 2003, 15:14

Сообщение 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]
Аватара пользователя
Marmot
Графоман
Сообщения: 39279
Зарегистрирован: 17 фев 2003, 17:58
Откуда: Caulfeild
Контактная информация:

Сообщение 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));
}
А мне, например, это неочевидно, глупый я наверное... :cry:
Хотя жизнь пока убеждает в обратном. :shock:
А придурочные junior developers иногда такую туфту гонят... :dunno:
Так что, вопрос был некорректный, имхо.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2 temp,
внимание, правильный ответ

func() возврашает указатель на структуру по указателю на ее поле a. это можно было в принципе понять из того что (а) вопрос entry-level (б) параметер называется a_ptr и возвращается указатель на структуру.
1)
внимание, был неправильный ответ (имею ввиду Вас, товарищЪ)
Дело в том, что в том коде, который Вы привели:

Код: Выделить всё

struct s 
{ 
  ... 
  int a; 
}; 
адрес s.a никогда не равен адресу s. Для вычисления адреса s по значению адреса s.a необходимо знать смещение a в s. В Вашем примере это невозможно сделать, поскольку многоточие в структуре стоит перед int a.
Это наталкивает меня на очень грустные мысли ( от кошмаров я уже отдохнул ). Думаю, что Вы были возбуждены также, как и джуниор, когда Вы задавали ему свой вопрос.

2Marmot,
Хотя жизнь пока убеждает в обратном.
Ах... :lol:
А придурочные junior developers иногда такую туфту гонят...
Вы, Мармот, сами говорили, что работали преподавателем. Тем более некоректно так говорить о джуниорах, имхо ("придурошные").
:twisted: :twisted: :twisted:
Так что, вопрос был некорректный, имхо.
Согласен. Но, не то чтобы некоректно. Здесь временный тестер людских голов показал нечто другое. :lol:

2MarkM,
Для проверки синтаксиса есть компилятор.
Вот ведь как!!! А я думал для изготовления исполняемого (выполнимого) кода :lol:
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

vg писал(а):адрес s.a никогда не равен адресу s.
Запросто, если a - первый члена в структуре, смещение - 0.

Чепуха эта функция. Логически анализировать даже не стоит. Уже наприкалывались. :twisted:
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

2 Woozy,
Запросто, если a - первый члена в структуре, смещение - 0.
1) Woozy, listen to me... No offence, But ... очень невнимательно читаешь мои постинги. Я постил, что в примере "временщика" это невозможно сделать, т.к. многоточие у него стоит перед int a. Стало быть - определить смещение не представляется возможным.

2) Тоже про твоё "запросто". Такие вопросы джуниору вообще не следует задавать, имхо. Связано это с тем, что в реальных задачах в зависимости от опций копмиллера (в части выравнивания структур по 32-битной границе) ты можешь получить разные значения смещения в массивах таких структур (если будешь использовать макро для смещения в виде констант). Но, похоже кое-кто в этом - вообще не бум-бум (я не о тебе).
Закрыто