如何在函数指针数组中创建一个 returns 函数指针的函数
How to make a function which returns a function pointer in an array of function pointers
我需要使用整数调用一个函数。
我真的是 C 语言的新手,函数指针非常混乱。
目标
- 我有很多乱七八糟的函数,如果我把它们写在
main.c
.
- 所以我把那些乱七八糟的函数写到另一个c文件里
messy_functs.c
- 在
main.c
中,我需要select那些乱七八糟的函数之一并调用它,这取决于从我的算法中获得的整数。这些函数通常需要两个参数,int input
和 int *output
.
- 被调用函数会将结果存储在
output
中,它作为指针传递
我的计划
- 在
messy_functs.c
中,创建一个数组 function_list[]
包含全局范围内的函数指针。
- 在
messy_functs.c
。创建一个函数 get_function_by_index(int function_index)
,returns 一个由参数索引的函数指针。
- 在
main.c
中,调用messy_function
传递function_index
,然后调用传递两个参数int input
和int *output
的返回函数得到结果。
问题
我的代码如下。但因错误而失败
error: too many arguments to function.
。请忽略一些错别字。
// 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 ignored as it ought to 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*)
传递或 returning 函数指针时,非常有一个函数指针类型的 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, ... };
对于return类型的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 语言的新手,函数指针非常混乱。
目标
- 我有很多乱七八糟的函数,如果我把它们写在
main.c
. - 所以我把那些乱七八糟的函数写到另一个c文件里
messy_functs.c
- 在
main.c
中,我需要select那些乱七八糟的函数之一并调用它,这取决于从我的算法中获得的整数。这些函数通常需要两个参数,int input
和int *output
. - 被调用函数会将结果存储在
output
中,它作为指针传递
我的计划
- 在
messy_functs.c
中,创建一个数组function_list[]
包含全局范围内的函数指针。 - 在
messy_functs.c
。创建一个函数get_function_by_index(int function_index)
,returns 一个由参数索引的函数指针。 - 在
main.c
中,调用messy_function
传递function_index
,然后调用传递两个参数int input
和int *output
的返回函数得到结果。
问题
我的代码如下。但因错误而失败
error: too many arguments to function.
。请忽略一些错别字。
// 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 ignored as it ought to 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*)
传递或 returning 函数指针时,非常有一个函数指针类型的 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, ... };
对于return类型的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);
}