gpt4 book ai didi

c++ - 如何在 gsl 集成中将 struct 分配给 void

转载 作者:行者123 更新时间:2023-12-02 10:27:25 25 4
gpt4 key购买 nike

我想使用 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此 void 指针的参数 a 和 b。

最佳答案

你选错了。这:

struct parameters alpha = *(struct parameters *) params;
...如果要复制 params,应写如下至 alpha :
struct parameters alpha = *((struct parameters *) params);
...但你后来使用 alpha作为一个指针,所以它应该是这样的:
struct parameters* alpha = (struct parameters *) params;
但是,您可以离开 struct由于结构为 typedef,因此在编程 C++ 时退出自动编辑。您还应该使用 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

关于c++ - 如何在 gsl 集成中将 struct 分配给 void,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63728262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com