如何在函数指针数组中创建一个 returns 函数指针的函数

How to make a function which returns a function pointer in an array of function pointers

我需要使用整数调用一个函数。 我真的是 C 语言的新手,函数指针非常混乱。

目标

  1. 我有很多乱七八糟的函数,如果我把它们写在 main.c.
  2. 所以我把那些乱七八糟的函数写到另一个c文件里messy_functs.c
  3. main.c中,我需要select那些乱七八糟的函数之一并调用它,这取决于从我的算法中获得的整数。这些函数通常需要两个参数,int inputint *output.
  4. 被调用函数会将结果存储在 output 中,它作为指针传递

我的计划

  1. messy_functs.c 中,创建一个数组 function_list[] 包含全局范围内的函数指针。
  2. messy_functs.c。创建一个函数 get_function_by_index(int function_index),returns 一个由参数索引的函数指针。
  3. main.c中,调用messy_function传递function_index,然后调用传递两个参数int inputint *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);
}