Если у меня есть набор небольших строковых значений, и я хочу получить числовое значение для их представления, что лучший способ сделать это с помощью таблицы поиска?
Если бы мне просто нужно было посмотреть прямо, я знаю, что оптимальное решение будет просто серией утверждений if:
if (strcmp(str, "foo") == 0)
tmp = FOO;
else if (strcmp(str, "bar") == 0)
tmp = BAR;
Но я прошу об этом, потому что эти маленькие строковые значения представляют собой атрибут в небольшом проекте, который я пишу на языке C, и атрибуты могут быть доступны только для чтения или читать-писать (без записи только сейчас, может быть, никогда).
Итак, что я сейчас делаю, чтобы убедиться, что все работает, есть функция поиска, состоящая из предложения if-then, как указано выше, чтобы посмотреть, какие значения доступны только для чтения, и вторая функция, которая ищет, какие значения считываются, написать. Но для меня это большое и уродливое.
Я думаю, вместо этого есть три функции. Одна функция - это функция поиска, и она возвращает значение int, которое является числовой формой строки. Но эта функция поиска также может принимать флаг, определяющий, извлекает ли значение только для чтения или значение чтения-записи. Если операция записи выполняется над значением, которое действительно доступно только для чтения, функция вернет -EINVAL (или что-то подобное).
Другие две функции, которые теперь все еще читают и пишут, просто вызывают эту функцию поиска, передавая строку значения и флаг, определяющий, предназначены ли они для чтения или записи.
Дело в том, что я не знаю, как это моделируется на C (если его можно смоделировать), и поиск Google утомителен, когда все фермы контента разрывают это место (и вместо этого дают ответы на С++/С#).
Так вот как я думаю, это будет выглядеть:
int lookup_func(const char *name, const char *flag) {
int tmpval = 0;
/* code to do the lookup. */
if (tmpval == 0)
return -EINVAL;
else
return tmpval;
}
int get_readonly_bit(const char *name) {
return lookup_func(name, "ro");
}
int get_readwrite_bit(const char *name) {
return lookup_func(name, "rw")
}
Мысли? Идея состоит в том, чтобы уменьшить размер кода, не повторяя ветки if-then для этих двух функций, которые немного отличаются в общем дизайне и просто позволяют какой-то функции поиска выяснить, какая функция служит для этого значения.