如何将函数分配给函数指针数组的元素

时间:2016-02-19 16:51:07

标签: c multidimensional-array function-pointers

在Xcode 7.2.1中,我声明了3个C函数

"Pointer to incomplete class type is not allowed"
button->callback = my_function;

现在我声明一个指向函数的指针并定义它。

double function1(double);
double function2(double);
double function3(double);

没有错误,正如所料。

现在我声明一个函数指针数组并用我的3个函数填充它。

double (*aFunctionPointer)(double)=function1;

同样,没有错误。

现在我定义了一个函数指针数组,但是没有填充它。

double (*anArrayOfFunctionPointers[3])(double)={function1, function2, function3};

同样,没有错误。

现在我尝试将一个函数分配给其中一个数组元素。

double (*anotherArrayOfFunctionPointers[3])(double);

这一次,警告和错误:

  • 警告:缺少类型说明符,默认为int
  • 错误:重新定义' anotherArrayOfFunctionPointers'使用不同的类型:' int [0]' vs' double(* [3])(double)'

我很难过。

背景是我正在尝试编写一个程序来在各种度量单位之间进行转换。我以为我会使用包含函数指针的二维数组,以避免一些非常冗长的switch语句。

要进行转换,我会按如下方式调用函数:

anotherArrayOfFunctionPointers[1]=function2;

并且convert函数将从数组中调用正确的函数,如下所示:

result=convert(someValueToConvert,yards,meters);

数组将按如下方式初始化:

return conversionFunctionArray[yards, meters](someValue);

关于函数指针和数组,我缺少什么?

2 个答案:

答案 0 :(得分:4)

根据问题中的零碎指示,以下是Minimal Complete Verifiable Example对此问题的看法。

#include <stdio.h>

double f1( double );
double f2( double );
double f3( double );

int main( void )
{
    // testing a single function pointer
    double (*ptr1)(double) = f1;
    printf( "%.0lf\n\n", (*ptr1)(5) );

    // testing an array of function pointers with an initializer list
    double (*array[3])(double) = { f1, f2, f3 };
    for ( int i = 0; i < 3; i++ )
        printf( "%.0lf\n", (*array[i])(6) );
    printf( "\n" );

    // testing an array of function pointers that is initialized by assignments
    double (*otherArray[3])(double);
    otherArray[0] = f1;
    otherArray[1] = f2;
    otherArray[2] = f3;
    for ( int i = 0; i < 3; i++ )
        printf( "%.0lf\n", (*otherArray[i])(7) );
    printf( "\n" );
}

double f1( double x ) { return 10+x; }
double f2( double x ) { return 20+x; }
double f3( double x ) { return 30+x; }

请注意,此代码编译时没有任何错误或警告,并产生预期的输出。再次证明为什么调试问题必须包括Minimal Complete Verifiable Example

答案 1 :(得分:2)

一个明显的问题是您实际上没有定义任何函数function1等。

要看到这一点,让我们只使用一个函数和仅使用一个元素的数组来完成此操作。把它放在最高级别:

double function1(double);
double (*aFunctionPointer)(double)=function1;
double (*anArrayOfFunctionPointers[1])(double)={function1};
double (*anotherArrayOfFunctionPointers[1])(double);

在实际的可执行代码中,执行以下操作:

anotherArrayOfFunctionPointers[0]=function1; // error

这是一个错误。但现在让我们定义 function1,就像这样:

double function1(double f) {return 3.0;};
double (*aFunctionPointer)(double)=function1;
double (*anArrayOfFunctionPointers[1])(double)={function1};
double (*anotherArrayOfFunctionPointers[1])(double);

现在让我们尝试相同的代码:

anotherArrayOfFunctionPointers[0]=function1;

没有错误。不同的是,现在我们实际上 一个function1指向。使用您的代码,那里没有。