将另一种类型传递给带有void指针参数的函数

时间:2018-02-19 10:51:44

标签: c pointers

我正在使用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 = &params;

我理解这是将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的每个值重复一次代码之外,我还能做些什么(哪个有效,但非常不优雅)?

1 个答案:

答案 0 :(得分:3)

  

我理解这是将my_f定义为一个带三个参数的函数,其中一个是void指针* p。我的问题是代替* p,我想使用一个范围从-5到+5的变量。

你必须意识到一件事:无论你发送什么,* p是3个双打的结构。看看你的功能定义。它被视为一个持有3个双打的结构。这类似于以下内容:double m[3];,因为它可以正确地投射到你需要的东西。

所以很明显只是发送phi作为一个浮动并不会削减它。通过强制转换将其作为参数正确发送的方式如下:(void *)&phi

这是一个帮助您理解的示例代码:Sample