在我继续之前,我发现的最接近我的问题是:subscripted value is neither array nor pointer function error 但该解决方案尚未适用于我的。
我有一个 C 函数,其目标是接收浮点数组和函数数组,将每个函数应用于浮点数组中相同索引的值,将值保存在作为参数传入的数组中。
我对语法非常小心,并为函数指针定义了一个类型:
typedef float (*func_ptr)(float);
(如果有人愿意向我解释为什么语法不是(不能作为)
typedef float (*)(float) func_ptr
的注释或解决方案,那也将不胜感激)有问题的功能(我认为最接近功能)然后看起来像:
void Vector_Function(void * _F, float v[], size_t size, float ret[]){
func_ptr (*F)[size]=_F; //trying to cast to pointer to array of function pointers
float (*F)[size]=_F;
for(size_t i=0; i<size; i++){
ret[i]=F[i](v[i]);
}
}
错误是:
> error: called object is not a function or function pointer
> ret[i]=F[i](v[i]);
> ^
真正让我吃惊的是,
typedef
似乎公然使 F[i]
成为一个函数指针......我尝试过的其他事情是:
void Vector_Function(void * _F, float v[], size_t size, float ret[]){
float (*F[size])(float)=_F;
for(size_t i=0; i<size; i++){
ret[i]=F[i](v[i]);
}
}
void Vector_Function(float (*F)[size], float v[], size_t size, float ret[]){
//just wrong
for(size_t i=0; i<size; i++){
ret[i]=F[i](v[i]);
}
}
最佳答案
执行转换时不需要包含 size
。如果 void*
是为了表示一个函数指针数组,那么你可以像这样转换为一个数组:
void Vector_Function(void * _F, float v[], size_t size, float ret[]){
func_ptr *funcs = (func_ptr*)(_F);
for(size_t i=0; i<size; i++){
func_ptr F = funcs[i];
ret[i]=F(v[i]);
}
}
您不需要任何关于数组中事物数量的指示来进行转换,因为数组指针只保存对数组开头的引用,并且没有关于附加到它的大小的信息。这要求您的
_F
具有某种格式,那么为什么不使用 func_ptr*
而不是 void*
类型呢?关于C函数指针既不是函数也不是指针,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45778239/