Вы можете создать массив типа структуры и использовать цикл:
struct KeyValue
{
int key_name;
int max_value; // Strictly less than threshold
};
static const struct KeyValue keys[] =
{
{ KEY_A_ACUTE, 159 },
{ KEY_I_ACUTE, 400 },
{ KEY_O_ACUTE, 537 },
{ KEY_U_ACUTE, 624 },
{ KEY_N_TILDE, 685 },
{ KEY_E_ACUTE, 800 },
};
enum { NUM_KEYS = sizeof(keys) / sizeof(key[0]) };
int analague_to_key_name(int analogue_value)
{
for (int i = 0; i < NUM_KEYS; i++)
{
if (analogue_value < keys[i].max_value)
return keys[i].key_name;
}
return KEY_UNKNOWN;
}
Единственная ошибка, связанная с значениями вне диапазона - я решил вернуть специальное значение KEY_UNKNOWN, но вы можете использовать любоесоответствующая альтернативная стратегия.Конечно, данные должны быть отсортированы в порядке возрастания max_value
.
. Одним из преимуществ этого метода является то, что на него не влияют добавления в таблицу, и он может обрабатывать любые произвольные различия между пороговыми значениями.Если таблица становится достаточно большой (возможно, несколько десятков записей), вы можете переключиться на специализированный бинарный поиск по значению, которое сделает меньше сравнений.Бинарный поиск специализирован, потому что вам нужно принять диапазон;вам может понадобиться создать структуру с min_value
, а также max_value
.