Re[3]: Конечный автомат это круто, но оно надо?
От: degor Россия  
Дата: 20.04.04 15:41
Оценка: 7 (2)
Здравствуйте, Olegator, Вы писали:

O>Да, это интересно. Но я как раз и хотел, чтобы кто-нибудь помог с оптимизацией моего кода.

Вчера мне было прикольней самому код написать. Типа этюд для программиста.

Главная твоя проблема в развесистом ifе, замаскированном под макрос SELEVENT.
Такие вещи принято заменять на выборку из таблицы:

// Таблица
static int SELEVENT[255];

// Инициализация (можно сделать экономней, особенно если объявить ER = 0, или вообще вбить ручками)

    for (int c = 0 ; c < sizeof(SELEVENT) / sizeof(SELEVENT[0]); ++c)
    {
        if (c == '.') SELEVENT[c] = 6;
        else if (c >= '6' && c <= '9') SELEVENT[c] = 5;
        else if (c == '3' || c == '4') SELEVENT[c] = 3;
        else if (c == '0') SELEVENT[c] = 0;
        else if (c == '1') SELEVENT[c] = 1;
        else if (c == '2') SELEVENT[c] = 2;
        else if (c == '5') SELEVENT[c] = 4;
        else SELEVENT[c] = ER;
    }

// Последний штрих:

        State s = transfer[curstate][SELEVENT[*str]];


И, о чудо! Код работает в два с половиной раза быстрей

O>P.S. Кстати, твоя функция выдаёт true на "022.001.099.003"


Это нормально.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.