我的应用程序库需要调用优化例程:
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
,和f
? obj()
函数需要调用其他需要 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 */
}
当然,如果您总是使用相同的n
、x
和f
,那么您只需通过模型
。
顺便说一句,不要使用 void *
作为函数指针:这不是一个好主意。
关于用于数值优化的 C 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10983148/