The website "dmilvdv.narod.ru." is not registered with uCoz.
If you are absolutely sure your website must be here,
please contact our Support Team.
If you were searching for something on the Internet and ended up here, try again:

About uCoz web-service

Community

Legal information

3.1 Основной цикл

3.1 Основной цикл

Предыдущая  Содержание  Следующая V*D*V

Основной цикл программы читает строку из стандартного потока ввода, инициализирует всё так, что числа и операторы могут быть извлечены, а пробелы проигнорованы, вызывает функцию для распознавания корректного арифметического выражения и как-то сохраняет его, и, наконец, обрабатывает всё, что было сохранено. Если что-то идёт не так, просто читаем следующую строку ввода. Вот основной цикл:

 

#include <setjmp.h>

 

static enum tokens token; /* текущий символ входного потока */

 

static jmp_buf onError;

 

int main (void) {

    volatile int errors = 0;

    char buf [BUFSIZ];

    if (setjmp(onError))

        ++ errors;

    while (gets(buf))

        if (scan(buf)) {

            void * e = sum();

            if (token)

                error("trash after sum");

            process(e);

            delete(e);

        }

    return errors > 0;

}

 

void error (const char * fmt, ...) {

    va_list ap;

 

    va_start(ap, fmt);

    vfprintf(stderr, fmt, ap), putc(’\n’, stderr);

    va_end(ap);

    longjmp(onError, 1);

}

 

Точка восстановления в случае ошибки определяется с помощью setjmp(). Если где-то в программе вызывается error(), longjmp() продолжает выполнение с другим значением, полученным от setjmp(). В этом случае результатом является значение, переданное в longjmp(), ошибка учитывается, и считывается следующая строка ввода. Код выхода программы информирует, были ли обнаружены какие-либо ошибки.

 

Предыдущая  Содержание  Следующая