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

Автор Perlik, 15 лет назад, По-русски
Всем привет. Столкнулся с проблемой и не знаю как решить. Загрузил генератор тестов во вкладке Files. Захожу в Tests, проверяю, он его успешно компилирует. После сохранения скрипта (пишу GenTest > {15-20}) во всех этих тестах появляется запись GenTest и стоит параметр Script, но как заставить его запустить этот генератор, чтобы он эти тесты сделал?
  • Проголосовать: нравится
  • +20
  • Проголосовать: не нравится

15 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится
Вроде показывает тесты, если на превью нажать.
  • 15 лет назад, скрыть # ^ |
     
    Проголосовать: нравится 0 Проголосовать: не нравится
    О, точно) У меня только почему-то Crashed. А rand можно использовать? И конструкции типа
    #ifdef WIN32  
    printf("%I64d",v[i]);
    #else
    printf("%lld",v[i]);
    #endif

    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +1 Проголосовать: не нравится
      Использовать rand() то можно, но testlib'овский rnd.next(), по-моему удобнее. Насчет таких конструкций - там на виндоуз все запускается, так что можно просто "%I64d" писать.
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        Спасибо, и еще вопрос, а количество памяти для генератора как ограничено?
        • 15 лет назад, скрыть # ^ |
           
          Проголосовать: нравится +1 Проголосовать: не нравится
          Никогда не задавался таким вопросом :) Один раз я написал очень медленный генератор и он ТЛил примерно через минуту, так что, думаю, и на память ограничение есть, но чисто символическое.
          • 15 лет назад, скрыть # ^ |
            ← Rev. 2  
            Проголосовать: нравится 0 Проголосовать: не нравится

            А с чем еще может быть связан вердикт Crashed? Запустил генератор здесь (насколько понимаю, версия C++ одна и та же) во вкладке "Запуск" и все нормально отработало.

            UPD. Уже разобрался.
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится +1 Проголосовать: не нравится
        1. Не нужно использовать rand().
        2. Не нужно просто писать "%I64d".
        Это затрудняет повторное использование задач. А сделать генератор более переносимым совсем не сложно.
    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится +1 Проголосовать: не нравится
      Использовать rand() не следует. Это затрудняет переиспользование задачи. Поскольку в стандарте языка Си не указано, как именно должна работать эта функция, в разных компиляторах она по-разному реализована. Когда такой генератор будут запускать на различных компьютерах под различными операционными системами и компилировать различными компиляторами, он в лучшем случае будет выдавать различные тесты. В худшем (если после этого автор тестов подбирает seed или не все генерируемые тесты корректны) окажется, что сгенерированы гораздо менее содержательные тесты или некорректные тесты. А это значит, что какое-то решение, падающее только на некоторых случайных тестах, может упасть в одном случае и не упасть в другом.

      Можно написать свой генератор в несколько строчек, взяв хорошие константы отсюда. Эта же страница помогает проэмулировать rand(), если кто-то таки сделал тесты через него (а это происходит всё время), и надо заставить генераторы работать под другим компилятором.

      Кстати, в версии testlib (0.6.4?), которая была на момент зимних сборов в Петрозаводске, генератор хоть и взят из Java, однако написан так, что последние версии GCC со включёнными оптимизациями компилируют его неправильно. Кажется, ничего не изменилось с тех пор?..

      Насчёт #ifdef WIN32: это действительно широко применяющийся способ. Когда printf-ов несколько, удобнее сделать #define INT64 "%lld" или "%I64d" и дальше писать printf (INT64 "\n", v[i]);
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        Вы, наверное, никогда не писали под polygon. Там есть свой rand, который инициализируется входными параметрами. В testlib.h можно найти инструкцию по применению.
      • 15 лет назад, скрыть # ^ |
         
        Проголосовать: нравится 0 Проголосовать: не нравится
        Вроде я довольно быстро поправил этот баг. В 0.7.1 его точно нет, а он был выпущен в середине февраля.

        Видимо писать #ifdef WIN32 не очень круто, так как, наверное, это не суперпереносимый вариант. Насколько я знаю под MinGW в g++ использование %I64d или %lld зависит от msvcrt.dll или какой-то похожей. Да и windows бывает не только 32-х битный.
        • 15 лет назад, скрыть # ^ |
           
          Проголосовать: нравится +1 Проголосовать: не нравится
          Можно извратиться и сделать что-то такое:

          char tmp[100];
          sprintf(tmp, "%lld", 10000000000LL);
          bool use_lld = true;
          if (strcmp(tmp, "10000000000")) use_lld = false;

          И затем писать
          if (use_lld) printf("%lld", a); else
          printf("%I64d", a);

          Это, правда, считается не во время компиляции и кода надо больше, зато будет работать.
        • 15 лет назад, скрыть # ^ |
           
          Проголосовать: нравится 0 Проголосовать: не нравится
          Действительно, это место поменялось. Значит, я куда-то не туда посмотрел, когда читал в прошлый раз. Прошу прощения.

          Ну, #ifdef WIN32 гораздо лучше, чем ничего, его в будущем можно скормить автозамене. Вообще, MinGW полупереведённый в 64 бита: вот сейчас проверил с TDM-GCC MinGW 4.5.1 x86_64, там задефайнено и WIN32, и WIN64. Хотя, действительно, #ifdef WIN64 тоже нужен на будущее.
15 лет назад, скрыть # |
 
Проголосовать: нравится +1 Проголосовать: не нравится
Круто. Готовите первый "синий" раунд в истории кодфорс? =)
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
Вы бы выложили код генератора.
  • 15 лет назад, скрыть # ^ |
    ← Rev. 3  
    Проголосовать: нравится 0 Проголосовать: не нравится
    • 15 лет назад, скрыть # ^ |
       
      Проголосовать: нравится 0 Проголосовать: не нравится
      Синтакс типа "gen > {10-12}" нужно использовать, если генератор создает файлы 10,11,12. Это удобно делать с помощью функции startTest(n). Лучше всего прочитайте пример multigen.cpp из дистрибутива testlib.

      Как отмечено выше, используйте cout для вывода 64-битных чисел. Конечно это подтормаживает, но проблем с выводом даже нескольких мегабайт не будет. А делать тесты на десятки мегабайт просто не стоит.

      Чтобы получше со всем разобраться, почитайте все исходники из дистрибутива testlib.
15 лет назад, скрыть # |
 
Проголосовать: нравится 0 Проголосовать: не нравится
А как все тесты через валидатор прогнать?