用于数值优化的 C 回调函数

标签 c optimization callback scope nested-function

我的应用程序库需要调用优化例程:

 err = optim(int n, double *x, double *f, void *obj)

然后例程将调用目标函数来请求目标函数值。

 void obj(int n, double *x, double *f)

optim() 是外部库的一部分。 optim() 和 obj() 的签名是固定的。

函数obj()需要访问单个对象“模型”中包含的数据。所有其他函数都传递指向模型对象的指针。因此,运行优化器的调用可能如下所示:

 err = doOptimize(model)

doOptimize()将设置问题并调用 optim()

 err= optim(model->n, model->x, model->f, model->obj)

问题是,obj()可以吗?函数访问驻留在 model 中的变量对象,除了 n , x ,和fobj()函数需要调用其他需要 model 的函数对象进行实际计算:

    updateParms(model);
    computeF(model);

我不知道怎么办obj()可以在没有实际句柄的情况下进行这些调用吗?下面的方法可以吗?

    updateParms();
    computeF();      

谢谢

最佳答案

是的,也不是。

当然,您的函数obj可以像任何其他内存一样访问模型,但我没有看到任何机制让它知道model的地址。

您需要向 obj 添加另一个参数,以在其中传递 model 指针。

在 C++ 中,您可能会通过将 obj 设为类模型 的“成员”来实现此目的。然后,编译器将添加一个名为 this 的隐藏参数(它对所有成员函数执行此操作),其中包含指向对象实例“模型”的指针。如果您想在纯 C 中实现相同的目标,那么您必须传递自己的 this 指针(但您可以随意调用它)。

所以,像这样:

... doOptimize (... model)
{
  ....
  optim (model->n, model->x, model->x, model)
  ....
}

... optim (int n, double *x, double *f, ... model)
{
  ....
  model->obj (n, x, f, model);
  ....
}

void obj (int n, double *x, double *f, ... model)
{
   /* use n, x, and f */
   /* use model->stuff */
}

当然,如果您总是使用相同的nxf,那么您只需通过模型

顺便说一句,不要使用 void * 作为函数指针:这不是一个好主意。

关于用于数值优化的 C 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10983148/

相关文章:

从一个字符串创建两个字符串

c - 从 stdin 或 file 输入,C

javascript - 何时/为何在回调函数中使用 "return"

python - Bokeh Slider自定义JS回调

c - C : why no performance degradation? 中数组的 AMD64 未对齐

c - malloc-free-malloc 和严格别名

javascript - 未使用的 css - 你如何清理它?

javascript - 如何从 jQuery 小部件中删除回调函数

c# - 如何使用固定的 32 位长度通过匿名管道发送整数?

mysql - MySQL5.6 查询优化