Стандартная библиотека C++ (2015)

Эта тема будет местом обсуждения с/к “Стандартная библиотека C++” для 3 курса ПМИ.

Тестирующая система ejudge. В настройках компиляции для компилятора make на самом деле стоит:

  1. распаковать tar-архив
  2. применить ко всем файлам clang++ -O3 -std=c++14 -stdlib=libc++
  3. слинковать полученные объектники clang++ -stdlib=libc++

Два комментария к прошедшей лекции.

Указанный мной пример:

void iswap(int&,int&);
long x(10), y(20)
iswap(x,y);

Вызывал проблемы в стандарте при “царе Горохе”. При нынешнем стандарте, действительно все замечательно диагностируется как ошибка.

После лекции в диалоге с Пашей я понял, что видимо сказал какую-то двусмысленную фразу о <br> const int& , а на лекции Виктор (кажется) тоже пытался обратить мое внимание на эту конструкцию. Два студента не один студент, так что хочу внести ясность. Эта конструкция говорит о передаче “ссылки на неизменяемый объект”, что является хорошим тоном для использования в ключе “не хочу передавать большой объект”. Напомню, два главных юз кейза для использования ссылок в параметрах функций: “нужно менять объект внутри функции” и “не хочу передавать большой объект, но обращаться к нему надо”.

PS: никчемный маркдаун в предпросмотре показывает не то, что в результирующем сообщении.

3 posts were split to a new topic: Обсуждение ссылок в параметрах

В условие задачи №1 и ее тесты внесены исправления. Еще будут добавлены тесты и немного более гибко написан чекер. Так что не переживайте, если какие-то тесты не проходят, это будет исправлено в ближайшее время.

Задача “ERP”. Чекер исправлен. Отправки перетестированы. В ближайшее время появятся остальные тесты.

--- Output: size 39 ---
ERROR BW 2
11111111111111111111 -1.000

--- Correct: size 37 ---
ERROR BW 2
11111111111111111111 -1.0

--- Stderr: size 0 ---

--- Checker output: size 21 ---
wrong output format 

Но:

--- Output: size 37 ---
ERROR BW 2
11111111111111111111 -1.0

--- Correct: size 37 ---
ERROR BW 2
11111111111111111111 -1.0

--- Stderr: size 0 ---

--- Checker output: size 4 ---
ok 

Чекер ожидает вещественное число с только одним знаком после десятичной точки, хотя в условии, в формате выходных данных, этого не указано. Так и задумано или в чекере ошибка?

Я больше склоняюсь к ошибке, поскольку во входных данных указана самая большая точность до 3х знаков.

Э-эх! В чекере ошибка.

Исправлено

====== Test #5 =======
--- Input: size 258 ---
4
BI 42 01.01.2014 10:00 `Paradise` 11133111666111712111 3.0
BI 777 02.01.2014 10:00 `Pandorium` 11133111666111712111 4.0
BI 87345 03.01.2014 10:00 `Distraction` 11111111111111111111 82.01
BI 23554 04.01.2014 10:00 `Distraction` 11133111666111712111 1000.03

--- Output: size 66 ---
OK 3
`Paradise` -3.000
`Pandorium` -4.000
`Distraction` -1082.040

--- Correct: size 60 ---
OK 3
`Paradise` -3.0
`Pandorium` -4.0
`Distraction` -1082.4

--- Checker output: size 4 ---
ok 

Что-то с точностью при проверке не так. В эталонном output’e ошибка, но чекер ее проигнорировал: Distraction -1082.4, а должно быть Distraction -1082.04

Хотя рядом есть запуски, на которых такое отлавливается: вероятно, чекер просто не полностью смотрит на эталонный output :smile:, но все равно.

Внимание! В настройках компиляции стоит clang++ -std=c++14 -O3. Стандарт с++14 запретил использовать страшные функции из cstdlib (см здесь). Точно видел такую проблему у Жарова Павла (using ::gets;).

Не пугайте так :slight_smile:

Не весь же cstdlib, а только самые страшные deprecated функции вроде gets()

Проверил, clang действительно не хочет. g++ с ключем -std=c++1y собирает.

Поправил

После замены стандарта на 14 у всех вышла ошибка компиляции. Я вот думаю, м.б. откатить на 11. Завтра приму решение.

Какой-то баг с clang. C g++ -std=c++1y все работает.

Я убрал все чисто сишные хедеры, но

#include<string>

подтягивает что-то, содержащее упоминание gets, и ему становится плохо.

А нельзя ли поставить другой компилятор? Это баг кленга и он будет возникать при попытке подключить fstream, istream, ios и прочие, потому что все они подключают cstdio. http://lists.cs.uiuc.edu/pipermail/llvmbugs/2014-May/034208.html

Вроде как все тесты проходит, правда пришлось убрать #include iostream и using namespace std; и тогда перестал ругаться.

Пока не докопался до причин и вернул с++11. Запустил перетестирование.

Итак, проблема со стандартом решена. Теперь все компилируется в 14 стандарте.

Кидаю тот же архив который компилировался неделю назад, сейчас он не компилируется и соответственно я до новых тестов не могу добраться

Еще очень странный результат:

====== Test #28 =======
--- Input: file is too large, original size 141746 ---
--- Output: size 28 ---
ERROR WW 84 1
`Meal` -2.291

--- Correct: size 54 ---
ERROR WW 84 31
`Meal` -2.291
`Strange Key` -17.243

--- Stderr: size 0 ---

--- Checker output: size 33 ---
wrong answer Bad product quntity

Почему-то в правильном ответе заявлена 31 позиция, когда представлено только две.

Аналогично в тесте 30