我正在使用GNU Scientific Library,它具有使用void指针作为输入的函数。 Example:
struct my_f_params { double a; double b; double c; };
double
my_f (double x[], size_t dim, void * p) {
struct my_f_params * fp = (struct my_f_params *)p;
if (dim != 2)
{
fprintf (stderr, "error: dim != 2");
abort ();
}
return fp->a * x[0] * x[0]
+ fp->b * x[0] * x[1]
+ fp->c * x[1] * x[1];
}
gsl_monte_function F;
struct my_f_params params = { 3.0, 2.0, 1.0 };
F.f = &my_f;
F.dim = 2;
F.params = ¶ms;
我理解这是将my_f定义为一个带三个参数的函数,其中一个是void指针* p。我的问题是代替* p,我想使用一个范围从-5到+5的变量。显而易见的事情是使用for循环,但以下操作不会运行:
float phi;
for (phi = -5.0; phi < 4.5; phi += 0.5) {
gsl_monte_function G = { &integrator, dim, phi };
[some code to tell the integrator to integrate]
}
编译器抱怨phi不是void指针。我最接近修复这个是尝试转换类型,例如使用*(float*)phi
而不是phi
,但它不起作用 - 它返回一个错误,说“从'float'类型无效转换为'float *'类型”。我为此尝试了谷歌搜索,但似乎没有人有这个问题。除了为phi的每个值重复一次代码之外,我还能做些什么(哪个有效,但非常不优雅)?
答案 0 :(得分:3)
我理解这是将my_f定义为一个带三个参数的函数,其中一个是void指针* p。我的问题是代替* p,我想使用一个范围从-5到+5的变量。
你必须意识到一件事:无论你发送什么,* p是3个双打的结构。看看你的功能定义。它被视为一个持有3个双打的结构。这类似于以下内容:double m[3];
,因为它可以正确地投射到你需要的东西。
所以很明显只是发送phi
作为一个浮动并不会削减它。通过强制转换将其作为参数正确发送的方式如下:(void *)&phi
。
这是一个帮助您理解的示例代码:Sample