Здравствуйте, 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"
Это нормально.