gpt4 book ai didi

c++ - 使用结构中定义的 GSL 函数

转载 作者:行者123 更新时间:2023-11-30 04:13:55 25 4
gpt4 key购买 nike

我想编写一个包含所有函数(包括 GSL 函数)和参数的结构来求解 ODE 系统。在主函数中,我只想调用结构中定义的更新函数来将系统推进一个时间步长。但是,当我尝试这样做时,出现错误:

Line 27, ERROR:  cannot convert ‘ODE::funcS’ from type ‘int (ODE::)(double, const double*, double*, void*)’ to type ‘int (*)(double, const double*, double*, void*)’ Below is a minimal code. \

这是我的代码的最小版本:

#include <iostream>
#include <gsl/gsl_errno.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_odeiv.h>

struct ODE
{
void update(double dt)
{
// code to advance ODE solution by one time-step dt
}

int
funcS (double t, const double y[], double f[],
void *params)
{
return GSL_SUCCESS;
}

double mu = 10;

gsl_odeiv_system sysS;

void
initializeSys()
{
sysS.function = funcS; //Line 27
}
};

int
func (double t, const double y[], double f[],
void *params)
{
return GSL_SUCCESS;
}

int main()
{
// GIVES ERROR
ODE mySys;
mySys.update(0.01);


// WORKS
double mu = 10;
gsl_odeiv_system sys;
sys.function = func;

return 0;
}

最佳答案

您不需要直接使用静态函数。相反,您可以编写一个非常通用的包装器。

I believe this is a duplicate question . My answer我刚刚链接的问题是基于提供的包装器 here .但是,我使用模板对其进行了概括,以避免 performance penalty of std::function由于 std::function 持有的仿函数的堆分配(原始答案仅警告读者由 std::function 实现中涉及的多重间接寻址造成的惩罚,与引起的问题相比,这是微不足道的堆分配)。

编辑 1:还讨论了这个问题 here

编辑 2(回答您在对我的回答的第一条评论中提出的问题)。第一个警告是您必须确保在 GSL 完成计算之前,std::function 包含的任何内容都不会被删除。此外,@Managu 指出,在 GSL 工作时,包装器本身不能超出范围。如果您仔细编码,这并不难执行。错误代码示例:

 // BAD PROGRAM - EXAMPLE OF WHAT YOU MUST NOT DO. DO NOT COPY THIS CODE
// HERE THE WRAPPER GETS PREMATURELY OUT OF SCOPE => CRASH
gsl_function *F
auto ptr = [](double x)->double{return 2*x;};
std::function<double(double)> FF1(std::cref(ptr))

{
gsl_function_pp Fp(FF1);
F = static_cast<gsl_function*>(&Fp);
}
(...)
// CALL GSL

关于c++ - 使用结构中定义的 GSL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19168492/

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