在我继续之前,我发现的最接近我的问题是: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/

10-11 22:05
查看更多