【发布时间】:2021-07-02 08:14:58
【问题描述】:
我需要使用整数调用函数。 我真的是 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, 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。
我知道一定有其他好的帖子可以解决我的问题。我已经阅读了很多关于函数指针和函数指针数组的帖子,但无法做到。
【问题讨论】:
-
就个人而言,我会回避使用函数指针,只需要一系列
if语句,适当地调用正确的函数。它更容易理解和阅读。根据我的经验,使用函数指针有意义的时候很少,特别是如果你是“C 语言的新手” -
如果你真的接受函数指针表的想法,回调和直接函数指针是指针类型别名(即在 typedef 别名中隐藏指针类型)仅有的两个地方之一实际上有帮助。您可能要考虑这一点。您不必必须这样做,但随着您的发现,代码可以很快变得非常神秘。
-
@MANA624 感谢您的友好评论。我一直在使用 Python,通常按名称或通过在列表中索引函数名称来调用函数。所以我有一些愿望以这种方式编写我的代码。但如果
if语句在 C 语言中更好,我会考虑它。如果我必须全部输入,我会打断我的手指。我想我已经使用 Python 生成了代码。 -
void (*get_function_by_index(int func_id))中的函数指针参数不用指定吗?所以像void (*get_function(int func_id))(int, int *)? -
@WhozCraig 感谢您的友好评论。是不是像Wikipedia 中介绍的那样?
标签: c function-pointers