#c #lookup-tables
#c #таблицы поиска
Вопрос:
Допустим, у меня была программа, в которой пользователь мог выбрать число от 0 до 10. Тогда каждое число будет соответствовать вызову определенной функции. В Python я знаю, что мог бы просто создать массив имен функций, индексировать его с помощью выбранной опции, а затем вызвать функцию. Как я могу реализовать это на C? Или это вообще возможно?
Комментарии:
1. Вы можете создать массив указателей на функции.
2. Указатели на функции поиска
Ответ №1:
Вот пример, как это сделать. Пожалуйста, обратите внимание, что все функции должны иметь одинаковую подпись, но, конечно, вы можете изменить ее с моего funptr
типа, например, на функцию, которая void
возвращает или принимает a char
, а не два int
s.
// Declare the type of function pointers.
// Here a function that takes two ints and returns an int.
typedef int (*funptr)(int, int);
// These are the two functions that shall be callable.
int f1(int a, int b) { return a b; }
int f2(int a, int b) { return a - b; }
// The array with all the functions.
funptr functions[] = {
f1,
f2,
};
// The caller.
int call(int i, int a, int b)
{
return functions[i](a, b);
}
Комментарии:
1. И если вам понадобятся причудливые сигнатуры функций нескольких типов, тогда вы заставляете свои функции принимать структуры или указатели на структуры, которые определяют входные и выходные параметры и типы. Эти структуры в конечном итоге начинают описывать абстрактное синтаксическое дерево (AST).
Ответ №2:
Единственная проблема, которую я вижу в решении выше, заключается в том, что нет проверки индекса массива (у вас могут возникнуть некоторые сложные проблемы). Чтобы сделать код более надежным, вы можете добавить проверку индекса (границ), например
- добавьте один оператор if внутри функции «call», где вы проверяете параметр i (не должен превышать максимальное значение)