问题描述
我想使用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 = α
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;
...如果要复制 params
到alpha
,则应编写如下:
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;
}