我需要使用整数调用函数。 我对 C 语言真的很陌生,函数指针非常困惑。
目标
- 我有很多乱七八糟的函数,如果我把它们写在
main.c
中,一切都会变得困惑。 - 所以我把那些乱七八糟的函数写进另一个c文件
messy_functs.c
- 在
main.c
中,我需要选择这些困惑的函数之一并调用它,具体取决于从我的算法获得的整数。这些函数通常需要两个参数:int input
和int *output
。 - 被调用函数会将结果存储在
output
中,并作为指针传递
我的计划
- 在
messy_functs.c
中,创建一个包含全局范围内的函数指针的数组function_list[]
。 - 在
messy_functs.c
中。创建一个函数get_function_by_index(int function_index)
,返回按参数索引的函数指针。 - 在
main.c
中,调用messy_function
并传递function_index
,然后通过传递两个参数int 调用返回的函数来获取结果输入
和int *输出
。
问题
我的代码如下。但因错误而失败
错误:函数参数过多。
。请忽略一些错别字。
// main.c
#include "messy_functs.h"
...
void get_result(int func_idx, int input, int *output)
{
(*get_function_by_index(func_idx))(input, output);
}
int main() {
int result, data, func_idx;
...
func_idx, data = some_algorithm_i_made(~~);
get_result(func_idx, data, &result);
printf("Got the result %d\n", result);
}
============
// messy_functs.c
#define FUNCTION_NUM 100
const void (*function_list[FUNCITON_NUM])(int input, int *output) = {func1, func2, func3, func_m, func_qwer, func_abab, ...(many functions) };
void (*get_function_by_index(int func_id)){
return function_list[func_id];
}
void func1(int input, int *output) {...}
void func2(int input, int *output) {...}
(... other functions)
我已尝试修复,但遇到了不同的错误,例如void value not returned as it should be
。
我知道一定还有其他好帖子可以解决我的问题。我读过很多关于函数指针和函数指针数组的文章,但没能读懂。
最佳答案
数组的正确定义是:
void (* const function_list[FUNCITON_NUM])(int input, int *output) = ...
对于get_function_by_index
将是:
void (*get_function_by_index(int func_id))(int, int*)
当传递或返回函数指针时,为函数指针类型提供 typedef 非常有帮助,可以使其更易于管理。
可以在messy_functs.h中为函数指针类型创建typedef
:
typedef void (*messy_func)(int, int *);
然后在messy_funct.c中,使用此类型作为数组:
const messy_func function_list[FUNCITON_NUM] = {func1, func2, func3, func_m, ... };
对于get_function_by_index
的返回类型
messy_func get_function_by_index(int func_id) {
return function_list[func_id];
}
你可以这样调用这个函数:
void get_result(int func_idx, int input, int *output)
{
get_function_by_index(func_idx)(input, output);
}
关于c - 如何创建一个返回函数指针数组中的函数指针的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66970449/