你如何在 gsl 集成中将结构分配给 void

How do you assign struct to a void in gsl integration

我想使用 gsl 包进行数值积分,这看起来很简单。但是,我的函数是多参数的。我使用结构数据类型作为函数的参数。这是我的代码,以集成函数 f=a*x+b 作为示例,其中包含参数 a 和 b.

#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>

struct parameters { double a; double b;};

double func (double x, void * params) {
        struct parameters alpha = *(struct parameters *) params;
        double func = alpha->a*x+alpha->b;
  return func;
}
            
int main (void)
{
    gsl_integration_cquad_workspace * w
      = gsl_integration_cquad_workspace_alloc (100);

  double result, error;
  size_t neval;
  struct parameters alpha = {10.0, 3.0};
  gsl_function F;
  F.function = &func;
  F.params = &alpha;

    gsl_integration_cquad(&F, 0, 1., 0., 1e-7, w, &result, &error, &neval);

  printf ("result          = % .18f\n", result);
  printf ("estimated error = % .18f\n", error);

    gsl_integration_cquad_workspace_free (w);

    return 0;
}

但这不起作用。我不知道如何集成多参数功能。此处命名的函数 (func) 具有参数 (void * params),我将其更改为除 void 指针以外的任何类型的变量时总是出错,并且我无法分配包含的 struct alpha此空指针的参数 a 和 b。

你选错了。这个:

struct parameters alpha = *(struct parameters *) params;

...如果要复制 paramsalpha应该写成下面这样:

struct parameters alpha = *((struct parameters *) params);

...但你后来使用 alpha 作为指针,所以它真的应该是这样的:

struct parameters* alpha = (struct parameters *) params;

然而,您可以在 C++ 编程时将 struct 排除在外,因为该结构是 typedef 自动编辑的。您还应该使用 C++ 转换:

double func(double x, void* params) {
    auto alpha = static_cast<parameters*>(params);

    return alpha->a * x + alpha->b;
}

您也可以将 alpha 作为参考:

double func(double x, void* params) {
    auto& alpha = *static_cast<parameters*>(params);

    return alpha.a * x + alpha.b;
}

Demo