Форум программистов, компьютерный форум, киберфорум
bigredcat
Войти
Регистрация
Восстановить пароль
Оценить эту запись

С++, Windows

Запись от bigredcat размещена 20.07.2012 в 16:24
Обновил(-а) bigredcat 31.07.2012 в 16:12

Тест на должность программиста C++, WinApi. Широко известная Российская компания-разработчик широко известного продукта (имена просили не указывать). Оригинальный текст и форматирование.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Какие проблемы Вы видите в этих фрагментах кода и как предлагаете их решать?
1.
void g( char *, char *, size_t );
void f( size_t n )
{
   char *a = new char[n];
   char *b = new char[n];
   g( a, b, n );
   delete [] b;
   delete [] a;
}
 
2.
int main(int argc, char* argv[])
{
   if( argc > 1 )
     printf( argv[1] );
   return 0;
}
Размещено в Без категории
Показов 2249 Комментарии 33
Всего комментариев 33
Комментарии
  1. Старый комментарий
    Аватар для dr.curse
    непонял скажем если я правильно отвечу то что будет?
    Запись от dr.curse размещена 20.07.2012 в 17:23 dr.curse вне форума
  2. Старый комментарий
    2.
    int main(int argc, char* argv[])
    {
    if( argc > 1 )
    {
    printf( argv[1] );
    };
    return 0;
    }
    Вроде так...
    Запись от ВАСИЛЕВС размещена 20.07.2012 в 18:00 ВАСИЛЕВС вне форума
  3. Старый комментарий
    Цитата:
    Сообщение от aram_gyumri Просмотреть комментарий
    непонял скажем если я правильно отвечу то что будет?
    Ничего не будет. Для меня этот тест не актуален.
    Запись от bigredcat размещена 20.07.2012 в 18:52 bigredcat вне форума
  4. Старый комментарий
    Цитата:
    Сообщение от Вася97 Просмотреть комментарий
    2.
    int main(int argc, char* argv[])
    {
    if( argc > 1 )
    {
    printf( argv[1] );
    };
    return 0;
    }
    Вроде так...

    Вася97
    , дело точно совсем не в этом. Обрати внимание на printf( argv[1] )
    Запись от bigredcat размещена 20.07.2012 в 18:54 bigredcat вне форума
  5. Старый комментарий
    Аватар для Pure
    http://liveworkspace.org/code/... 6929b67623

    кроме ругачки не неконст в чем проблемы?
    да и при чем тут виндовс
    Запись от Pure размещена 21.07.2012 в 21:00 Pure вне форума
  6. Старый комментарий
    =) Такой интересный вопрос: А что вы выводите? =)>
    C++
    1
    
    printf( argv[1] );
    Понятно что будет Ошибка по какому-то адресу в каком-то .dll =)

    Если вы хотите так что-то вывести, то сначала надо туда что-то записать=)
    Запись от InfoMaster размещена 22.07.2012 в 16:40 InfoMaster вне форума
  7. Старый комментарий
    Ну во втором примере пользователь может толкнуть форматную строку в виде аргумента и, в лучшем случае, уронить приложение. Нужно через %s выводить.
    Запись от Vourhey размещена 26.07.2012 в 12:24 Vourhey вне форума
  8. Старый комментарий
    Delete
    Запись от bigredcat размещена 27.07.2012 в 20:08 bigredcat вне форума
    Обновил(-а) bigredcat 27.07.2012 в 20:37 (не актуально)
  9. Старый комментарий
    Цитата:
    Сообщение от Vourhey Просмотреть комментарий
    Ну во втором примере пользователь может толкнуть форматную строку в виде аргумента и, в лучшем случае, уронить приложение. Нужно через %s выводить.
    Да, так может быть. Читал об этом у Стива Макконалла, по-моему (вроде бы, книга называлась "Совершенный код" или что-то про "[какое-то число] ошибок ...").
    А вот что с этим:
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    void g( char *, char *, size_t );
    void f( size_t n )
    {
       char *a = new char[n];
       char *b = new char[n];
       g( a, b, n );
       delete [] b;
       delete [] a;
    }
    Запись от bigredcat размещена 27.07.2012 в 20:26 bigredcat вне форума
  10. Старый комментарий
    Цитата:
    Сообщение от InfoMaster Просмотреть комментарий
    =) Такой интересный вопрос: А что вы выводите? =)>
    C++
    1
    
    printf( argv[1] );
    Понятно что будет Ошибка по какому-то адресу в каком-то .dll =)
    Если вы хотите так что-то вывести, то сначала надо туда что-то записать=)
    Я ничего не ввожу. Вводят пользователи, то ... что вводят. Могут ввести "Hello World". А могут "%s%s"...
    Запись от bigredcat размещена 27.07.2012 в 20:33 bigredcat вне форума
  11. Старый комментарий
    Цитата:
    Сообщение от Pure Просмотреть комментарий
    http://liveworkspace.org/code/... 6929b67623

    кроме ругачки не неконст в чем проблемы?
    да и при чем тут виндовс
    Проблема в том, что в зависимости от того, что вы ввели (см. комментарий Vourhey), приложение может себя повести не так как я (или вы) того хотели. А Windows пока тут не при чем, только C/C++. Это первый вопрос, на котором большая часть отсеивается, возможно, по невнимательности.
    Запись от bigredcat размещена 27.07.2012 в 20:36 bigredcat вне форума
  12. Старый комментарий
    Аватар для grizlik78
    А в первой задаче имелась в виду утечка памяти?
    Если при выделении памяти для b произойдёт исключение, то память, выделенная для a освобождаться не будет. Если исключение выбросит функция g, то не освобождёнными окажутся оба массива. Векторами их заменить самое простое.
    Запись от grizlik78 размещена 27.07.2012 в 21:05 grizlik78 на форуме
  13. Старый комментарий
    Аватар для Evg
    Про второй тест всё сказали. В первом тесте я не знаю, что по стандарту будет, если в new[] указать нулевой размер. Других проблем в данном фрагменте кода вроде бы как и не видно
    Запись от Evg размещена 29.07.2012 в 23:23 Evg вне форума
  14. Старый комментарий
    Цитата:
    Сообщение от grizlik78 Просмотреть комментарий
    А в первой задаче имелась в виду утечка памяти?
    Если при выделении памяти для b произойдёт исключение, то память, выделенная для a освобождаться не будет. Если исключение выбросит функция g, то не освобождёнными окажутся оба массива. Векторами их заменить самое простое.
    Думаю, что да. Вариант с try ... catch раскритиковали, как более сложный и запутанный. Сказали, что проблему можно решить гораздо проще.
    Запись от bigredcat размещена 01.08.2012 в 00:36 bigredcat вне форума
  15. Старый комментарий
    Цитата:
    Сообщение от Evg Просмотреть комментарий
    Про второй тест всё сказали. В первом тесте я не знаю, что по стандарту будет, если в new[] указать нулевой размер. Других проблем в данном фрагменте кода вроде бы как и не видно
    Судя по этому я так понял, что все нормально должно быть.
    5.3.4 New
    ...
    7 When the value of the expression in a noptr-new-declarator is zero, the allocation function is called to allocate an array with no elements. ...

    5.3.5 Delete
    ...
    2 ... In the second alternative (delete array), the value of the operand of delete may be a null pointer value or a pointer value that resulted from a previous array new-expression.79 If not, the behavior is undefined. ...
    79) For non-zero-length arrays, this is the same as a pointer to the first element of the array created by that new-expression. Zero-length arrays do not have a first element.
    Запись от bigredcat размещена 01.08.2012 в 00:37 bigredcat вне форума
  16. Старый комментарий
    Аватар для Evg
    Цитата:
    Сообщение от bigredcat Просмотреть комментарий
    Судя по этому я так понял, что все нормально должно быть.
    Да уже неактуально. Проблема лежала на поверхности - возможная нехватка памяти
    Запись от Evg размещена 01.08.2012 в 08:54 Evg вне форума
  17. Старый комментарий
    А если серьезно, то какая там трабла в первой задаче? Я думал, там проверку на ошибку выделения опустили просто для упрощения...
    Запись от Vourhey размещена 01.08.2012 в 12:25 Vourhey вне форума
  18. Старый комментарий
    Оба задания на тему антипаттернов

    По первому я просто предложил использовать try-catch. На что мне ответили, что и код получится длиннее и, соответственно, шансов запутаться будет больше. Попросил пояснить - посоветовали перечитать Страуструпа .
    В общем я так понял, что это должен быть вполне очевидный антипаттерн. Типа не используйте С-массивы, используйте подходящие контейнеры и умные указатели.
    Запись от bigredcat размещена 01.08.2012 в 14:19 bigredcat вне форума
  19. Старый комментарий
    Цитата:
    Сообщение от bigredcat Просмотреть комментарий
    Попросил пояснить - посоветовали перечитать Страуструпа .
    Странные какие-то.
    Запись от Vourhey размещена 01.08.2012 в 16:58 Vourhey вне форума
  20. Старый комментарий
    Аватар для Evg
    Цитата:
    Сообщение от Vourhey Просмотреть комментарий
    Странные какие-то.
    +1. Есть подозрение, что мозг у людей уже закостенел, а потому мыслят шаблонно

    При этом, насколько я понимаю, ни то, ни другое не спасёт в ситуации, когда закончилась память
    Запись от Evg размещена 01.08.2012 в 19:32 Evg вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.