保存函数指针的容器

时间:2016-10-16 16:24:30

标签: c containers

我需要一个容器来保存某些数字的函数指针。 喜欢

1 = function add
2 = function sub
3 = function mult

等等。这是一个简单的中断处理程序,根据中断号,应该调用某个函数。  我认为我可以使用结构化列表来完成此操作,但我知道最大条目数量的大小。所以我想到了像

这样的字符串数组
const char *functions[2];
a[0] = "add";
a[1] = "sub";

但后来我不知道如何进一步使用琴弦。 任何提示或想法?

提前致谢!

编辑:为了澄清,我在这里有两个重要的功能,一个,我想将一个函数指针与一个数字一起保存到某个容器中。另一个,它只是说"转到该容器中某个数字的功能"。所以第一个函数得到一个int数(比如从1到50)和一个指向函数的指针。那些应该保存在一起。然后第二个函数只获取一个int数作为参数,然后它应该调用与我的容器中的int数相关联的函数。我要问的是如何保存指向函数的指针和数字。

EDIT2:我确实想保存函数指针。我想我可以将函数名称保存为字符串,然后将其用作函数名称,因为我不知道另一种方式。

2 个答案:

答案 0 :(得分:1)

你必须存储函数指针,所以定义一个新的函数指针类型并创建一个数组。根据您的问题,所有函数都应该使用两个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] = {&addInt, &subInt, &multipleInt};
    int i;

    for(i = 0; i < 3; i++)
    {
        printf("inputs: 2 and 3 result: %d\n", function_list[i](2,3));
    }
    return 0;
}

输出:

enter image description here

请注意,因为它是一个数组,索引是0, 1, 2

要添加自己的ID,您可以使用函数指针和int ID创建一个stuct。

typedef struct operation
{
    int (*operation_p)(int,int);
    int id;
} math_operation_t;

您甚至可以构建链接列表,并在定义第三个成员变量时动态添加函数,该变量应该是指向下一个元素的指针。

答案 1 :(得分: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 = &sub; // points to the function "sub". The & is optional

// now use it:
int result = myFuncPtr(23, 42);

函数指针的类型取决于返回值和要指向的函数的参数。

您可以更轻松地声明函数指针变量 通过使用typedef:

typedef int (*funcPtr) (int, int);

现在使用typedef声明并初始化一个函数指针,如下所示:

funcPtr myFuncPtr = &add;

当然,您现在可以将许多指针放入数组中 并通过索引访问它们:

funcPtr funcPtrs[] = { &sub, add }; // like i said, the ampersand is optional
int result = funcPtrs[0](23, 42);