Форум Всеукраїнської інтернет-олімпіади NetOI


На форумі обговорюються лише питання, пов'язані з олімпіадою

Ви не зайшли.

#1 2017-01-29 23:47:30

jurij
Новий користувач
Зареєстрований: 2009-01-23
Повідомлень: 40

Пример в задаче Hopper

Обнаружил очень странную ситуацию. Пример в задаче Hopper проходит on-line проверку при заведомо неправильной программе. Из-за этого пропустил ошибку в программе. Случайно переставил строку ввода данных до выделения памяти под массив данных. А тестовый пример прошел без проблем. Как такое может быть?

Поза форумом

 

#2 2017-01-30 05:11:06

Dim_ov
Новий користувач
Зареєстрований: 2009-11-29
Повідомлень: 312
Вебсайт

Re: Пример в задаче Hopper

Якщо я правильно все розумію, ви використовували С++ і написали щось типу такого:

Код:

int n;
int *array = new int[n];
cin >> n;

Якщо все так і було, то ви зіткнулися з таким явищем, як невизначена поведінка (undefined behavior, UB). В С++ UB може виникнути у багатьох ситуаціях, наприклад при читанні неініціалізованої змінної. У даному конкретному випадку - змінної n.

jurij написав:

А тестовый пример прошел без проблем. Как такое может быть?

Програма після виникнення UB, за визначенням, може робити що завгодно. Буквально. Може працювати так, як і задумав програміст, може впасти з помилкою, а може показати мультик, або відформатувати жорсткий диск. Останні два приклади - це невелике художнє перебільшення, насправді жоден компілятор такого робити не стане, але формально якби компілятор згенерував код демонстрації nyan cat при UB, це було б абсолютно коректно. При чому, часто один і той самий код з UB може по-різному працювати при компіляції різними компіляторами, різними версіями одного компілятора, при запуску на різних машинах і т.п.  (і зараз я вже говорив не про якісь гіпотетичні компілятори з мультиками, які роблять всякі веселі штуки назло програмісту просто тому що можуть, а про цілком реальні, такі як gcc, clang, чи VS C++). Почитайте Вікіпедію за посиланням вище, і/або ось цю статтю - знайдете більш докладний опис, що таке UB, що роблять компілятори, коли на нього натикаються і чим загрожує використання конструкцій з UB в своїй програмі.

Тому те, що програма була "завідомо неправильна" - це правда. Але через природу своєї "неправильності" (UB), той факт, що така неправильна програма пройшла один тест в онлайн-перевірці - це абсолютно нормально і нічого неочікуваного тут немає. Зрештою, програма, яка просто виводить 5 теж є завідомо неправильною, але при цьому вона так само пройшла б тест з умови.

Відредаговано Dim_ov (2017-01-30 05:18:37)

Поза форумом

 

#3 2017-01-30 11:01:20

jurij
Новий користувач
Зареєстрований: 2009-01-23
Повідомлень: 40

Re: Пример в задаче Hopper

Dim_ov написав:

Якщо я правильно все розумію, ви використовували С++ і написали щось типу такого:

Код:

int n;
int *array = new int[n];
cin >> n;

Якщо все так і було, то ви зіткнулися з таким явищем, як невизначена поведінка (undefined behavior, UB). В С++ UB може виникнути у багатьох ситуаціях, наприклад при читанні неініціалізованої змінної. У даному конкретному випадку - змінної n.

Трохи інакше

Код:

int n,*array;
cin >> n;
for (i=0;i<n;i++) cin >> array[i];
array = new int[n];

бо я спочатку статично виділяв array[1000] , а потім перейшов на дінамічне виділення, але принципово зрозуміло. Дякую.

Поза форумом

 

Нижній колонтитул

Powered by Likt
© Copyright 2002–2009 Likt