我遇到的问题如下。我正在使用GSL在较大的C ++程序中执行函数的数值积分。我用于数字积分的代码如下
struct psi_params
{
double d_s;
double yav_s;
double sig_s;
double dE_s;
};
/* Function to define the psi function appearing in the first-passage time formulas. Note that this function holds only
* for the special potential made by an exponential plus a sigmoid
*/
double psi(double y, void * p)
{
auto * params = (struct psi_params *) p;
double d = (params->d_s);
double yav = (params->yav_s);
double sig = (params->sig_s);
double dE = (params->dE_s);
return pow(M_E, d / pow(M_E, pow(y - yav, 2) / (2. * pow(sig, 2))) - (dE * (1 + (y - yav) / (sig * sqrt(1 + pow(y - yav, 2) / pow(sig, 2))))) / 2.);
}
/* Function to numerically evaluate the integrals of the psi function with the gsl.Note that this function holds only
* for the special potential made by an exponential plus a sigmoid
*/
double Integral_I(double d,
double yav,
double sig,
double dE,
double a,
double b)
{
struct psi_params parameters = { d, yav, sig, dE };
gsl_function Psi;
Psi.function = ψ
Psi.params = ¶meters;
double result, error;
gsl_integration_workspace *w = gsl_integration_workspace_alloc(1000);
gsl_integration_qags(&Psi, a, b, 0, 1e-7, 1000, w, &result, &error);
return result;
}
问题是我的IDE(clion)告诉我变量&parameters在行中转义了本地范围
Psi.params = ¶meters;
实际上我不明白为什么会这样,原因如下:
1)C ++从来不是我的强项,而我上次使用它是7年前。
2)我给出的MWE是对GLS参考手册(here)提供的示例的较小修改,同时带有参数(here)的GSL_function的定义。另外,GSL人员here提供了与上述方法类似的MWE,以执行带有参数的函数的数值积分。我希望这些例子都是防犯规的。
3)我发现了一个旧线程(here),其中讨论了退出变量范围的问题,但是我不确定它们是否与我的问题有关(请参阅第1点)。最重要的是,没有提供最低限度的工作示例,因此我不知道如何进行。
欢迎您提供任何解决此问题的帮助。