我正在使用 Gnu Scientific Library 在我的程序中实现一个以数值方式计算积分的模块。这些函数基于可以在 GSL 网站上的数值积分示例中找到的示例:
这是我的代码(大部分与示例中的相同):
typedef map<float, float> SignalData;
double f (double x, void * params) {
SignalData * alpha = static_cast<SignalData *>(params);
double f = InterpolatorGSL::interpolatedValueForTime(alpha, x);
return f;
}
float IntegrationComparator::integral(SignalData * signalData){
gsl_integration_workspace * w = gsl_integration_workspace_alloc (100000);
double result, error;
double expected = -4.0;
SignalData * alpha = signalData;
gsl_function F;
F.function = &f;
F.params = α
gsl_integration_qags (&F, -3.36e-08, -2.36e-08 , 0, 1e-7, 100000,
w, &result, &error);
printf ("result = % .18f\n", result);
printf ("exact result = % .18f\n", expected);
printf ("estimated error = % .18f\n", error);
printf ("actual error = % .18f\n", result - expected);
printf ("intervals = %d\n", w->size);
gsl_integration_workspace_free (w);
}
该问题可以跟踪到以下行:
SignalData * alpha = static_cast<SignalData *>(params);
演员表显然不能正常工作:如果我尝试对 SignalData 对象做任何事情(即使用任何将其作为参数的方法,即打印出来的方法),它会产生分段违规错误(它实际上打印在错误之前取出 4 个随机数)。在我上面粘贴的代码中,它是使用此对象的插值方法,这就是发生分段冲突的地方:
InterpolatorGSL::interpolatedValueForTime(alpha, x);
但这也是由于铸造错误造成的。
我对 C++ 没有太多经验,而且我以前从未使用过 void 指针,所以如果这是一个愚蠢的问题,请原谅,但是将 mymap<float, float> *
作为void *
参数传递的正确方法是什么?