如何参数化我提交给外部库的回调函数

时间:2017-03-19 04:31:31

标签: c callback libraries

假设我有一个外部库来计算给定函数的最小值,比如最小值。说它的标题给我一个功能

double[] minimizer(ObjFun f)

标题定义

typedef double (*ObjFun)(double x[])

和“minimizer”返回例如二维向量x的函数f的最小值。

现在,我想使用它来最小化参数化函数。我不知道如何在代码中准确地表达这一点,但是如果我最小化二次形式(只是一个愚蠢的例子,我知道这些已经关闭形式最小值)

double quadraticForm(double x[]) {
    return x[0]*x[0]*q11 + 2*x[0]*x[1]*q12 +  x[1]*x[1]*q22
}

由常数(q11,q12,q22)参数化。我想编写用户可以在运行时输入(q11,q12,q22)的代码,我可以生成一个函数来作为回调给库,并返回最优。

在C中建议的方法是什么?

我对C生锈了,所以询问可行性和最佳实践。我真的想用C / Cython代码来解决这个问题。到目前为止我使用python绑定到库并使用“内部函数”,在python中如何做到这一点非常明显:

def getFunction(q11, q12, q22):
    def f(x):
        return x[0]*x[0]*q11 + 2*x[0]*x[1]*q12 +  x[1]*x[1]*q22
    return f
// now submit getFunction(/*user params*/) to the library

我正在试图找出C构造,以便我可以更好地了解创建Cython等价物。

1 个答案:

答案 0 :(得分:-1)

标头定义了一个可用作回调函数的原型。我假设你不能/不会改变那个标题。

如果您的功能有更多参数,则无法通过呼叫填写这些参数 您的函数不能被称为回调,以避免未定义的行为或参数中的伪造值 其功能不能作为回调给出;没有额外的参数。

以上意味着你需要放弃"参数化"你的功能。

您的实际目标是以某种方式允许在运行时更改常量/系数。
找到一种不同的方式。想想"动态配置"而不是"参数化"。
即该函数并不总是期望每次调用时的值。它只是访问它们 (这表明配置值比调用函数更少,但不需要它。)

如何
我只能想到一个简单的方法,它非常丑陋和脆弱(例如由于赛车条件,并发访问,重入;你说它,它会伤害你......):

  • 为了便于阅读,引入一组全局变量或更好的一个结构变量。 (参见下面的建议" file-global"而不是" global&#34 ;.)
  • 使用单独的函数在运行时将它们设置为所需的值。
  • 将它们初始化为有意义的默认值,以防它们永远不会被写入。
  • 在最小化回调函数的开头读取它们。
  • 建议:将一切(最小化功能,配置变量和在运行时设置配置的功能)放在一个代码文件中,并使配置变量保持静态(即限制对此代码文件的访问)。 / LI>

注意:
答案只是分析,以及为什么你不应该尝试参数。 提出的方法不被视为答案的一部分;它比简单更好 我邀请更全面的答案,提出更安全的实施。