将参数传递给函数指针数组

时间:2014-10-06 06:44:10

标签: c arrays arduino function-pointers

我在C中编写一个使用函数指针数组的程序。如果我不包含参数,我可以使用我的代码调用函数而不会出现问题。

int (*functionsArray[2][3])() = {
  {functionOne,functionTwo,functionThree},
  {functionFour,functionFive,functionSix}
};

然而,当我尝试传递参数int x

int (*functionsArray[2][3])(int x) = {
  {functionOne,functionTwo,functionThree},
  {functionFour,functionFive,functionSix}
};

我收到错误:

invalid conversion from 'int (*)()' to 'int (*)(int)'

这些函数也没有返回int,我不能将它们声明为void吗?

void(*functionsArray[2][3])(int x) = {
  {functionOne,functionTwo,functionThree},
  {functionFour,functionFive,functionSix}
};

尝试此操作会导致错误:

 error: invalid conversion from 'int (*)()' to 'void (*)(int)'

感谢。

2 个答案:

答案 0 :(得分:1)

这样可以正常工作,提供你正确地声明了这些功能:

#include <stdio.h>

int functionOne(int x)   { return 1; }
int functionTwo(int x)   { return 2; }
int functionThree(int x) { return 3; }
int functionFour(int x)  { return 4; }
int functionFive(int x)  { return 5; }
int functionSix(int x)   { return 6; }

int (*functionsArray[2][3])(int x) = {
    {functionOne,  functionTwo,  functionThree},
    {functionFour, functionFive, functionSix}
};

int main (void) {
    printf ("%d\n", (functionsArray[0][1])(99));
    printf ("%d\n", (functionsArray[1][2])(99));
    return 0;
}

该计划的输出为26


如果您想要返回值,它也会起作用:

#include <stdio.h>

void functionOne(int x)   { puts ("1"); }
void functionTwo(int x)   { puts ("2"); }
void functionThree(int x) { puts ("3"); }
void functionFour(int x)  { puts ("4"); }
void functionFive(int x)  { puts ("5"); }
void functionSix(int x)   { puts ("6"); }

void (*functionsArray[2][3])(int x) = {
    {functionOne,  functionTwo,  functionThree},
    {functionFour, functionFive, functionSix}
};

int main (void) {
    (functionsArray[0][1])(99);
    (functionsArray[1][2])(99);
    return 0;
}

该程序按预期输出26


这一切都归结为确保函数声明与数组中给出的类型匹配。

答案 1 :(得分:0)

声明数组时:

int (*functionsArray[2][3])(int x) = 
{
   {functionOne,functionTwo,functionThree},
   {functionFour,functionFive,functionSix}
};

数组的每个元素都必须是int (*)(int)类型。否则,编译器会正确报告错误。

举一个简单的案例:

void foo()
{
}

int (*fp)(int x) = foo;

应该导致相同的编译器错误,因为您尝试使用int (*)(int)初始化foo类型的变量,其类型为void (*)()