Serve.cfg:problem:source header

From EjudgeWiki

Навигация: Главная страница/Система ejudge/Использование/Конфигурационные файлы/serve.cfg/Конфигурационные параметры задач/source_header

Редактирование элемента: страница "Editing contest", вкладка "Problems (serve.cfg)", блок "Abstract problems", поле "Source header file", либо страница "Editing contest", вкладка "Problems (serve.cfg)", блок "Concrete problems", поле "Source header file".

Данная переменная вместе с переменной source_footer позволяет задавать имя файла с текстом, который будет использоваться в начале и конце сданных решений при компиляции программы. Например, условие задачи может требовать написания одной функции или класса, а не целой программы. В этом случае при компиляции в начало текста программы можно добавить, например, директивы подключения необходимых библиотек, а в конец программы - главную функцию программы, которая считывает входные данные из файла, запускает пользовательскую функцию и записывает результат в выходной файл. Таким образом на турнирах могут использоваться задачи в стиле TopCoder. Значения переменных наследуются от абстрактной задачи, при этом выполняются форматные подстановки. Особенность данных переменных в том, что форматные подстановки выполняются непосредственно перед компиляцией программы и, таким образом, могут использовать форматные преобразования языка программирование. С помощью форматных преобразования языка программирования можно использовать различные файлы для разных языков программирования.

source_header и source_footer обычно лежит там же, где и условия задач (в каталоге statements). Рекомендуется в конце source_header и начале source_footer ставить лишний перевод строки, чтобы текст, посланный участником, не склеивался и не вызывал ошибку компиляции. Valgrind и компиляторы сообщают о номере строки, в которой произошла ошибка. Из-за source_header'а номера строк изменяются. Чтобы участники могли понять, в чём ошибка, рекомендуется либо указывать длину source_header'а в условии, либо, если позволяет язык, явным образом делать номера строк сдвинутыми на некую большую круглую константу.

Пример source_header'а.


#include <stdio.h>
#include <string.h>

int cmp_int(const void * p1, const void * p2);

int main()
{
        int x,y,z;
        scanf("%d",&x);
        scanf("%d",&y);
        z=cmp_int(&x,&y);
        if(((x-y<0)&&(z<0))||((x-y>0)&&(z>0))||((x==y)&&(z==0))) 
                {printf("%d\n",x-y); return 0;}
        printf("%d\n",z);
        return 0;
}

#line 1000


В данной задаче участник должен реализовать функцию cmp_int. Логика проверки (фактически, чекер) встроена в source_header. Аргументы, передаваемые функции, берутся из тестов и часть их может быть видна участнику, а в случае ошибки вывод функции участника виден как вывод программы. Чекер может использоваться стандартный (cmp_int).


В описании задачи в конфигурационном файле serve.cfg можно указать, что в разных вариантах header'ы будут разными. Например:

[problem]
id = 87
super = "Generic"
short_name = "elong_07"
long_name = "is equal"
max_open_file_count = 32
max_process_count = 64
full_score = 80
test_score = 1
score_bonus = "16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1"
open_tests = "1:full"
standard_checker = "cmp_file"
enable_language = "gcc-vg"
enable_language = "g++-vg"
variant_num = 2
source_header = "elong_07_begin-%Vv.c"

В данном примере в зависимости от варианта перед кодом участника будет либо elong_07_begin-1.c, либо elong_07_begin-2.c. Если делаете эти файлы символическими ссылками, они не должны вести на один и тот же файл.