在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);
这一次,警告和错误:
我很难过。
背景是我正在尝试编写一个程序来在各种度量单位之间进行转换。我以为我会使用包含函数指针的二维数组,以避免一些非常冗长的switch语句。
要进行转换,我会按如下方式调用函数:
anotherArrayOfFunctionPointers[1]=function2;
并且convert函数将从数组中调用正确的函数,如下所示:
result=convert(someValueToConvert,yards,meters);
数组将按如下方式初始化:
return conversionFunctionArray[yards, meters](someValue);
关于函数指针和数组,我缺少什么?
答案 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
指向。使用您的代码,那里没有。