Прежде всего, избавьтесь от int
и замените его на char
или uint8_t
. Кажется маловероятным, что у вас есть таблица символов с отрицательными индексами.
Далее, вы в основном проверяете, находится ли что-то в определенных интервалах. Наименее неэффективный способ сделать это с помощью if-else - это сделать это в порядке возрастания:
if(ascii < 17)
...
else if(ascii < 25)
...
else if(ascii < 33)
...
Очевидно, что "числа волхвов c" следует заменить константами или символьными литералами.
Если есть интервалы 8 (это , а не то, что дают ваши маги c числа), вы можете улучшить производительность, выполнив ascii / 8
в качестве поиска. Либо с помощью простого переключателя, либо, возможно, с помощью поиска указателя на функцию. Пример последнего:
#include <stdio.h>
#include <stdint.h>
void f0_7 (uint8_t n) { printf("%d %s\n", n, __func__); }
void f8_15 (uint8_t n) { printf("%d %s\n", n, __func__); }
void f16_23 (uint8_t n) { printf("%d %s\n", n, __func__); }
... // up to 127
void interpreteASCII(uint8_t ascii)
{
typedef void(lookup_func)(uint8_t);
lookup_func* const LOOKUP[] = { f0_7, f8_15, f16_23, ... /* up to 127 */ };
LOOKUP[ascii/8](ascii);
}
int main (void)
{
for(uint8_t i=0; i<24; i++)
{
interpreteASCII(i);
}
return 0;
}
(хотя некоторая проверка границ перед вызовом такого поиска в таблице не является плохой идеей.)