C函数指针既不是函数也不是指针

标签 c arrays pointers

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

相关文章:

c - 将 3D 数组作为参数传递给 C 中的函数

c - 递归反转一个长度为2^n的整数数组,不修改原数组返回一个新数组

c - 错误 :request for member 'id' in something not a structure or union

c++ - 将共享库与 GCC 链接时出现问题

c - C语言中的"too many arguments to function"

java - 一旦计数器达到某个值,就递增数组

c - 如何初始化这些指针?

php - 如何解析发送到 ajax 的 POST 数据?

C++ 通过引用传递数组

c++ - 将函数标记为脏(指定调用者应保存所有寄存器)