"Интересный" код

Опубликовано Sep 12, 2011 в Собеседование: Результаты | 2 коммент.


"Интересный" код

Около месяца назад мы проводили очередное собеседование на позицию C++ Developer.

Офисное собеседование было решено начать с просьбы выполнить небольшое тестовое задание, в рамках которого, помимо реализации логики, требовалось записать результирующее значение типа int в файл.

Кандидат был знаком с функциями API CreateFile  и WriteFile.

После самостоятельной работы кандидатом был предложен следующий код:

int result;
// некоторая логика  ...
char *buf = new char[4];
int res1 = result;
for(int i = 0; i++; i< sizeof(result))
{
  char c = (char)  res1 & 0xF;
  buf[i] = c;
  res1 = res1>>sizeof(c);
}
WriteFile(hfile, buf, sizeof(buf), p1, p2);
...

Первый взгляд на код нас очень озадачил.

Попробуйте понять – зачем этот код?

Как выяснилось впоследствии – кандидат не знал, что можно получить указатель на область памяти, где хранится тип данных int как  int* pInt=  &result; Вместо этого было реализовано копирование в массив char с целью дальнейшей передачи массива для записи в файл (при этом был допущен ряд ошибок).

Вот с такими интересными и нестандартными решениями порой приходится сталкиваться в процессе интервью :)


2 Коммент. : “"Интересный" код”

  1. Постарался исправить вариант кандидата:
    http://pastebin.com/1nVR2iyD

    const int BITS_PER_BYTE = 8;
    int result = 0;
    // I would initialize the variable.
    // logic block  ...
    int res = result;
    int numBytesInResult = 0;
    while(res != 0)
    {
    	numBytesInResult++;
    	res = res >> BITS_PER_BYTE;
    }
    char *buf = new char[numBytesInResult + 1];
    buf[numBytesInResult] = '\0';
    for(int i = 0; i < numBytesInResult; i++)
    {
    	char c = (char)  result & 0xF;		// took the last byte of "result" and saved it in "с"
    	buf[numBytesInResult - i - 1] = c;	// write to buf from the youngest byte to oldest
    	result = result >> BITS_PER_BYTE;
    }
    // WriteFile
    delete [] buf;

    Правда это решение “в лоб”. Надо подумать, как бы элегантнее сделать.
    Не факт, что WriteFile отработает так, как ожидается.

Оставить комментарий

Ваш адрес email не будет опубликован.


*