#c #containers
#c #контейнеры
Вопрос:
Мне нужен контейнер для сохранения указателей на функции на определенные числа. Нравится
1 = function add
2 = function sub
3 = function mult
И так далее. Это для простого обработчика прерываний, где в зависимости от номера прерывания должна вызываться определенная функция.
Я думал, что смогу сделать это со структурированным списком, но я знаю размер максимального количества записей. Итак, я подумал о массиве строк, таких как
const char *functions[2];
a[0] = "add";
a[1] = "sub";
Но тогда я не знаю, как я могу дальше использовать строки.
Любые советы или мысли?
Заранее спасибо!
РЕДАКТИРОВАТЬ: Чтобы уточнить, у меня здесь есть 2 важные функции, одна, где я хочу сохранить указатель на функцию вместе с числом в какой-либо контейнер. И еще один, в котором просто написано «перейти к функции, которая находится под определенным номером в этом контейнере». Итак, первая функция получает номер int (скажем, от 1 до 50) и указатель на функцию. Они должны быть сохранены вместе. Затем вторая функция просто получает номер int в качестве параметра, а затем она должна вызвать функцию, которая связана с этим номером int в моем контейнере. Я спрашиваю, как я мог бы сохранить указатель, который указывает на функцию вместе с числом.
EDIT2: я действительно хочу сохранить указатели на функции. Я подумал, что, возможно, смогу сохранить имя функции в виде строки, а затем использовать его позже как имя функции, потому что я не знал другого способа.
Комментарии:
1. Вы спрашиваете, как будто мы знаем, что вы делаете. Ваш вопрос очень неясен.
2. Вы хотите сохранить строки или указатели на функции? То, что вы показали нам сейчас, является первым. Если вы хотите последнее, удалите кавычки и
functions
соответствующим образом измените тип.3. Извините за неточность, я отредактировал свой вопрос.
Ответ №1:
Если вы хотите сохранить и использовать указатель на функцию, вы можете сделать это следующим образом:
// the functions you want to point to
int add(int a, int b) { do stuff }
int sub(int a, int b) { do some other stuff }
...
// declare and set a function pointer
int (*myFuncPtr) (int, int);
myFuncPtr = amp;sub; // points to the function "sub". The amp; is optional
// now use it:
int result = myFuncPtr(23, 42);
Тип указателя на функцию зависит от возвращаемого значения и параметров функции, на которую вы хотите указать.
Вы можете упростить объявление переменной указателя функции, используя typedef:
typedef int (*funcPtr) (int, int);
Теперь объявите и инициализируйте указатель на функцию, используя typedef следующим образом:
funcPtr myFuncPtr = amp;add;
Конечно, теперь вы можете поместить многие из этих указателей в массив
и получить к ним доступ по индексам:
funcPtr funcPtrs[] = { amp;sub, add }; // like i said, the ampersand is optional
int result = funcPtrs[0](23, 42);
Ответ №2:
Вы должны хранить указатели на функции, поэтому определите новый тип указателя на функцию и создайте массив. Согласно вашему вопросу, все функции должны принимать два int
параметра и возвращать и int
, поэтому новый тип должен быть примерно таким:
typedef int (*operation_t)(int,int);
Теперь вы можете создать массив operation_t
. Весь код целиком:
#include <stdio.h>
typedef int (*operation_t)(int,int);
int addInt(int n, int m) {
return n m;
}
int subInt(int n, int m) {
return n-m;
}
int multipleInt(int n, int m) {
return n*m;
}
int main ()
{
const operation_t function_list[3] = {amp;addInt, amp;subInt, amp;multipleInt};
int i;
for(i = 0; i < 3; i )
{
printf("inputs: 2 and 3 result: %dn", function_list[i](2,3));
}
return 0;
}
На выходе:
Обратите внимание, что, поскольку это массив, индексы являются 0, 1, 2
.
Чтобы добавить собственный идентификатор, вы можете создать stuct с указателем на функцию и int
идентификатором.
typedef struct operation
{
int (*operation_p)(int,int);
int id;
} math_operation_t;
Вы даже можете создать связанный список и динамически добавлять функции, если вы определите третью переменную-член, которая должна быть указателем на следующий элемент.