Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中具有不同返回类型和参数的函数指针数组_C_Function Pointers - Fatal编程技术网

C中具有不同返回类型和参数的函数指针数组

C中具有不同返回类型和参数的函数指针数组,c,function-pointers,C,Function Pointers,我有3个具有不同返回类型和不同参数的函数。我试图创建一个函数指针数组,然后调用它们。但它不起作用。请提供一些建议 #include <stdio.h> /* Array of function pointers (different return types and parameters) */ void sayHello() { printf("Hello World\n"); } int add(int a, int b) { return a+b; }

我有3个具有不同返回类型和不同参数的函数。我试图创建一个函数指针数组,然后调用它们。但它不起作用。请提供一些建议

#include <stdio.h>

/* Array of function pointers (different return types and parameters) */

void sayHello()
{
    printf("Hello World\n");
}

int add(int a, int b)
{
    return a+b;
}

int twice(int a)
{
    return 2*a;
}

int main()
{
    int choice;
    int(*add_ptr)(int,int) = NULL;
    void(*hello_ptr)(void) = NULL;
    int(*twice_ptr)(int) = NULL;

    void * func_table[] = {(void *)sayHello, (void *)add, (void *)twice};


    printf("Add : %d\n", ((add_ptr)func_table[1])(10,5));
    printf("Hello : \n",((hello_ptr)func_table[0])());
    printf("Twice : %d\n",((twice_ptr)func_table[2])(10));
    return 0;
}

似乎您希望
add_ptr
hello_ptr
tweep_ptr
成为函数指针类型(因为您正在强制转换它们),而不是变量:

typedef int(*add_ptr)(int,int);
typedef void(*hello_ptr)(void);
typedef int(*twice_ptr)(int);
或者,如果要将
添加\u ptr
你好\u ptr
两次\u ptr
作为变量,并将
函数表的元素分配给这些变量,则:

add_ptr = func_table[1];
hello_ptr = func_table[0];
twice_ptr = func_table[2];
printf("Add : %d\n", add_ptr(10,5));
printf("Hello : "); hello_ptr();
printf("Twice : %d\n", twice_ptr(10));

此外,您不需要在此处强制转换为
void*

void * func_table[] = {sayHello, add, twice};

此外,零参数函数
sayHello
main
在其参数列表中缺少关键字
void
。它们应该是这样的:

void sayHello(void) { … }
int main(void) { … }

“但它不起作用”-请解释什么不起作用。您只能强制转换为类型而不是变量<代码>INTA;printf(“%d\n”,(int)3.14)
将编译并输出
3
INTA;printf(“%d\n”,(a)3.14)不会。函数指针不一定适合
void*
。因此,出于可移植性的原因,代码具有未定义的行为-UB。建议使用
union
而不是
void*
。我投票重新打开这个问题,因为(现在)问题非常清楚,应该给用户一个正确的答案。是的。是否需要
typedef
?为什么?我很困惑……
typedef void(*hello_ptr)(void)应该是
typedef void(*hello_ptr)(),对吗?@CoolGuy它应该是带有
void
sayHello
main
的声明在它们的参数列表中丢失了
void
。@InsaneCoder是因为您想将
add_ptr
(等)声明为类型,而不是变量。或者,您可能只想将
func\u表[1]
分配给
add\u ptr
变量。其语法为
add_ptr=func_table[1]@tuple\u cat是。那也行。我建议在你的回答中提及这一点。
void * func_table[] = {sayHello, add, twice};
void sayHello(void) { … }
int main(void) { … }