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

С++, Windows

Запись от bigredcat размещена 20.07.2012 в 16:24
Показов 7536 Комментарии 33

Тест на должность программиста 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;
}
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 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 =)

    Если вы хотите так что-то вывести, то сначала надо туда что-то записать=)
    Запись от InfoMister размещена 22.07.2012 в 16:40 InfoMister вне форума
  7. Старый комментарий
    Ну во втором примере пользователь может толкнуть форматную строку в виде аргумента и, в лучшем случае, уронить приложение. Нужно через %s выводить.
    Запись от Vourhey размещена 26.07.2012 в 12:24 Vourhey вне форума
  8. Старый комментарий
    Delete
    Запись от bigredcat размещена 27.07.2012 в 20:08 bigredcat вне форума
  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 вне форума
 
Новые блоги и статьи
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
Перемещение строк из ТЧ в другой документ с учетом текущего пробега
Maks 17.08.2026
Реализация из решения ниже выполнена на примере нетипового документа "Автозапчасти", с ТЧ "Шины". За основу взят алгоритм отсюда: https:/ / www. cyberforum. ru/ blogs/ 359708/ 10838. html Задача: . . .
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru