Здравствуйте, nazavrik, Вы писали:
N>Здравствуйте, Stepkh, Вы писали:
S>>С вопросом: что не нравится, какие есть проблемы и как бы вы решили:
N>Интереса для.
N>1. Не инициализируется массив. Не критично, но не помешает. N>2. Не контролируется размер передаваемых данных при копировании в массив. N>3. Возвращается указатель на массив, который был создан в теле функции.
N>По хорошему нужно передавать в функцию два массива — источник и приемник. Проверять размерности. Использовать strncpy. м?
Здравствуйте, Stepkh, Вы писали:
S>Здравствуйте, amberovsky, Вы писали:
A>>Здравствуйте. A>>При попытке устроится в одну фирму прислали "удалённое" тестовое задание.
S>Да абсолютно нормальное задание. Конечно лучше подобное давать тет-а-тет, а не удаленно. Но...
S>Вот есть мой тестовый кусок кода, который даю кандидатам. S>С вопросом: что не нравится, какие есть проблемы и как бы вы решили:
S>Поверьте, из 10 кандидатов, только 2-3 человека могут указать на все проблемы. S>Порядка половины может указать на одну или две.
есть подозрение, что половина этих "проблем" — надуманные проблемы.
у этого кода только одна проблема — он не компилируется. (при включенных предупреждениях компилятора которые трактуются как ошибки)
при попытке ее решить возникает другая проблема — это код на Си.
дальше можно только добавить, что в моем компиляторе strcpy перегружен шаблоном функции и с размером "tmp" никакой проблемы нет, как Вы возможно считаете.
также "с" мог бы иметь тип "const char*, но это не проблема этого кода, может так было сделано специально,
а 80 такое же магическое число, как и осмысленные имена "foo" и "c"
A>есть подозрение, что половина этих "проблем" — надуманные проблемы.
A>у этого кода только одна проблема — он не компилируется. (при включенных предупреждениях компилятора которые трактуются как ошибки) A>при попытке ее решить возникает другая проблема — это код на Си.
A>дальше можно только добавить, что в моем компиляторе strcpy перегружен шаблоном функции и с размером "tmp" никакой проблемы нет, как Вы возможно считаете. A>также "с" мог бы иметь тип "const char*, но это не проблема этого кода, может так было сделано специально, A>а 80 такое же магическое число, как и осмысленные имена "foo" и "c"
Вы наверно невнимательно читали исходный пост — этот код был взят из реального(!) проекта.
И жил там полтора года, пока не пришлось брать в руки большой напильник и чинить, чинить.
По поводу не компилируется: всё зависит от вашего компилятора. Никто не помешает вам, как истинному джедаю,
отключить все предупреждения для конкретного файла. (И ведь делают так!!!) А потом приходится лезть в makefile
и материться и материться.
Вот, например, gcc 2.7 даже не муркнет на этот код. Да, древний компилятор, но.. не мы устанавливаем правила.
А вот gcc постарше кинет предупреждение:
main.cpp: In function ‘char* foo(char*)’:
main.cpp:6:9: warning: address of local variable ‘tmp’ returned [enabled by default]
И что? да ничего — соберется все за милую душу.
А что будет мешать нам собираться — то удалим (-Werror нам мешает)
Тут уже больше относится к дисциплине, но, ведь человек должен понимать что он делает?
я пару раз давал такое задание , и встречал полное непонимание.
-----
" Програмисту дали задание реализовать функцию которая возвращает текущее время с точностью до секунды. В результате он показал заголовочный файл с таким объявлением
currentTime.h
int getCurrentTime();
Вопрос , какие вы видите проблемы и как бы вы смогли улучшить этот код?
"
-----
Интересно что скажет уважаемый All на это задание ?
Здравствуйте, Abyx, Вы писали:
A>*зачем* его инициализировать? A>чтоб подавить предупреждение о неинициализированной переменной? A>или чтоб в 99.9% случаев баг с отсутствием нуля на конце строки спрятать?
Ну это как в анекдоте. У Маши было 8 яблок. 2 яблока она отдала Пете. Вопрос: сколько яблок у Пети?
S>Поверьте, из 10 кандидатов, только 2-3 человека могут указать на все проблемы. S>Порядка половины может указать на одну или две.
Проблем в этом коде всего две.
1. Это не C++
2. Смысла в этом коде нет.
Ввиду пунка 2 искать дальнейшие проблемы и спорить до усера о необходимости инициализации tmp и допустимости возврата указателя на локальную переменную совершенно бессмысленно, этот код подлежит отправке "на помоечку".
Tы знаешь, твои задачки трудны не тем, что они какие-то шибко закавыристые, а тем, что непонятно зачем вообше все это надо. Все таки должна быть хоть какая то логика пусть даже и в тестовых задачах. Подозреваю, что многие из опрошенных были в ступоре от функции, которая возвращает ту же самую информацию, что была в нее подана как аргумент, да еще предварительно покопировав ее в локальную строку. Собеседование — это тот еще стресс. Ты бы хотя бы функции и пременные назвал так, чтобы человек с без телепатических способностей мог догадаться, что твоя функция фууу должна была делать. Короче, правильный ответ на вопрос что не нравится — "Да, все", а как исправить — "А что надо-то?".
По поводу этой фуу с маллоком, тоже неясно, зачем она вообще и как ты хочешь ее улучшить. Что в ней плохого? То, что она без единого free? Так может она и есть аллокатор, и удалять не ее забота. Или ты намекаешь что функция большое_веселье должна была удалять, так опять не понятно зачем ей столько буферов в цикле если можно было бы одним обойтись, причем не обязательно динамическим. Да и статик/нестатик — как это влияет: разве функция не возвращает адрес из маллока? Ты что убрал статик — и сразу все починилось?