Я использую Научную библиотеку Gnu для реализации модуля в моей программе, который вычисляет интегралы численно. функции основаны на примере, который можно найти на веб-сайте GSL в Numerical integration examples:Cast from void * производит ошибку сегментации Ошибка
и вот мой код (большинство из них так же, как в примере):
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, поэтому извините меня, если это глупый вопрос, но каков правильный способ передать мой map<float, float> *
в качестве параметра void *
?
Спасибо, он работал как шарм! –