Блог пользователя VladimirYakovlev

Автор VladimirYakovlev, 10 лет назад, По-русски

На Timus Online Judge обновлены компиляторы:

  • MinGW GCC 4.9.1

  • Clang 3.5

  • FreePascal 2.6.4

  • JDK 8.0

  • Scala 2.11.2

  • Python 2.7.8

  • Python 3.4.1

Некоторые изменения:

  • Благодаря компилятору Clang на Тимусе теперь поддерживается C++14.

  • Для всех новых компиляторов ненулевой код возврата решения теперь приведет к результату проверки Runtime error (non-zero exit code).

  • Вызов функции exit а Питоне больше не приведет к Runtime error.

  • В MinGW программы линкуются с libmsvcr110, а не с libmsvcrt, что, например, позволяет пользоваться спецификатором %lld, а не %I64d. Если интересно, как это настроить, спрашивайте.

  • Проблема с BigInteger.isProbablePrime в JDK теперь решается не как раньше. В JDK 8.0 этот метод перестал по-умолчанию зависеть от SecureRandom. Теперь isProbablePrime использует ThreadLocalRandom, который инициализируется исходя из MAC-адреса и текущего времени. Поскольку MAC-адрес на сервере никогда не меняется, а его определение требует доступа к опасным функциям, этот шаг инициализации ThreadLocalRandom был убран.

Подробнее в новостях на Тимусе.

UPD. Как в MinGW слинковать программу с libmsvcr110.

Создаем файл specs.msvcr110:

%rename cpp msvcrXX_cpp

%rename cc1plus msvcrXX_cc1plus

*cpp:
%(msvcrXX_cpp) -D__MSVCRT_VERSION__=0x1100

*cc1plus:
%(msvcrXX_cc1plus) -D__MSVCRT_VERSION__=0x1100

*libgcc:
-lmingw32 -lgcc -lgcc_eh -lstdc++ -lmoldname -lmingwex -lmsvcr110

В командную строку компилятора добавляем опцию -specs=specs.msvcr110.

  • Проголосовать: нравится
  • +25
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

В MinGW программы линкуются с libmsvcr110, а не с libmsvcrt, что, например, позволяет пользоваться спецификатором %lld, а не %I64d. Если интересно, как это настроить, спрашивайте.

Интересно, спрашиваю :) . А %I64d при этом ведь перестаёт работать? Тогда ещё интересно, можно ли поймать такую линковку на уровне кода решения (#ifdef), чтобы написать переносимое решение, вида:

#ifdef __WIN32__ // что теперь?
#define INT64 "%I64d"
#else
#define INT64 "%lld"
#endif
...
printf (INT64 "\n", res);