在我继续之前,我发现的最接近的问题是:subscripted value is neither array nor pointer function error但解决方案尚未适用于我的。
我有一个C函数,其目标是接受一个浮点数组和一个函数数组,将每个函数应用于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]);
}
}
答案 0 :(得分:3)
进行演员表时,您不需要包含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*
?
答案 1 :(得分:1)
你可以这样想让你更好地理解,
1 float f(float x)
。:
这是一个带有arg f()
的函数x
,函数的名称是一个地址/指针,所以f
应该是一个指针,所以你可以定义一个如下所示的函数指针:{ {1}},就像其他指针一样,您可以初始为float (*f_x)(float x)
2 f_x = f
。:
这非常简单,只需将typedef int INT_TYPE
类型重命名为int
基于以上所述,INT_TYPE
- &gt; float (*f_x)(float x)
。最后,您应该始终记住:typedef float (*F_X_TYPE)(float x)
的优先级高于()