如何解决如何制作一个返回函数指针数组中的函数指针的函数 目标我的计划问题
我需要使用整数调用函数。 我真的是 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 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,&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 instruction_functions[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*)
在传递或返回函数指针时,为函数指针类型设置一个 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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。