我想在数据接收书中使用Brents方法来最小化函数。最小化程序的签名基本上如下:
float brent(float (*f)(float), float *xmin, "other parameters not relevant to question")
您可以猜测brent
返回f
的最小值,并将其参数存储在xmin
中。
但是,我想要最小化的函数的确切形式取决于其他参数。说
float minimize_me(float x, float a, float b)
一旦我决定了a
和b
的值,我想根据x
将其最小化。
我可以简单地向所有调用的函数添加其他参数,一直到brent
,从而将其签名更改为
float brent(float (*f)(float,float,float),float a ,float b , float *xmin, ...)
每次在(*f)(x,a,b)
内拨打brent
。然而,这对我来说似乎并不优雅,因为我现在不仅要将指针传递给minimize_me
,还要传递整个函数链中的两个附加参数。
我怀疑可能有一个更优雅的解决方案,比如创建一个指向函数版本的指针,a
和b
为固定值。
即使这是一个非常模糊的解决方案,请不要让它离开我,因为我觉得它可以提高我对语言的整体理解。
答案 0 :(得分:6)
实现这一目标的可行方法是使用结构来存储所有值并将指针传递给函数。
struct parameters{
int valueA;
int valueB;
};
int function(void* params){
parameters* data = (parameters*) params;
return data->valueA + data->valueB; // just an example
}
int main(){
parameters myData;
myData.valueA = 4;
myData.valueB = 2;
function(&myData);
return 0;
}
答案 1 :(得分:5)
您需要的是currying,例如:
给出三个变量的函数 f(x,y,z)和两个值 a 和 b ,构造一个变量的函数 g ,使 g(z)= f(a,b,z)。
Alas C语言不能让你讨好。这种结构仅适用于函数式语言,C不是一种结构。这并不意味着你真的不能这样做,但是在语言中没有给出它的构造。所以你需要自己重建机制。有关示例,请参阅Currying/binding with ISO C99或Is there a way to do currying in C?。
答案 2 :(得分:1)
GCC的本地函数扩展使用非常快乐(使用-std = gnu11):
float brent(float (*f)(float), float *xmin);
float minimize_me(float x, float a, float b);
int main() {
...
float min_me_local(float x) { return minimize_me(x, 1, 2); }
brent(min_me_local, xmin);
...
}
我希望它是标准的,但事实并非如此。因此,在瞄准可移植性时,更喜欢来自@Nefrin的回答。