你如何在 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 = α
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;
...如果要复制 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;
}
我想使用 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 = α
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;
...如果要复制 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;
}