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

问题描述

我想使用gsl软件包进行数值积分,这看起来很容易。但是,我的功能是多参数。我将struct数据类型用作函数的参数。这是我的代码,以集成函数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,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指针以外的任何类型的变量时,我总是会报错,并且我无法分配包含以下内容的结构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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...