gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:29:15 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com