在我继续之前,我发现最接近我的问题是:subscripted value is neither array nor pointer function error但该解决方案尚未适用于我的。
我有一个 C 函数,其目标是接受一个 float 组和一个函数数组,将每个函数应用于 float 组中相同索引的值,将值保存在作为参数传入的数组中。
我非常注意语法并为函数指针定义了一个类型:
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/