指向带有一些但不是所有参数的函数的指针已修复

Pointer to function with some, but not all arguments fixed

我想使用 Numerical Recepies Book 中的 Brents 方法来最小化函数。最小化例程的签名基本上如下所示:

float brent(float (*f)(float), float *xmin, "other parameters not relevant to question")

你可以猜到 brent returns f 的最小值并将其参数存储在 xmin 中。 但是,我想要最小化的函数的确切形式取决于附加参数。说

float minimize_me(float x, float a, float b)

一旦我决定了 ab 的值,我想相对于 x 最小化它。

我可以简单地向所有调用的函数添加额外的参数,一直到 brent,从而将其签名更改为

float brent(float (*f)(float,float,float),float a ,float b , float *xmin, ...)

因此每次都在 brent 中调用 (*f)(x,a,b)。然而,这对我来说似乎并不优雅,因为我现在不仅要传递指向 minimize_me 的指针,还要传递整个函数链下的两个附加参数。

我怀疑可能有一个更优雅的解决方案,比如创建一个指向函数版本的指针,其中 ab 作为固定值。

即使它是一个非常晦涩的解决方案,也请不要向我隐瞒它,因为我觉得它可以提高我对语言的整体理解。

实现此目的的一种可行方法是使用结构来存储所有值并将指向该值的指针传递给函数。

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;
}

你需要的是currying,比如:

given a function of three variables f(x,y,z) and two values a and b, construct the function g of one variable such that g(z)=f(a,b,z).

唉C语言不能让你柯里化。这种构造仅适用于函数式语言,而 C 不是。这并不意味着你真的做不到,但语言中没有给定的结构。所以你需要自己重构机制。有关示例,请参阅 Currying/binding with ISO C99 or Is there a way to do currying in C?

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 的回答。