Я работаю с gsl для интеграции функции. Эта функция встроена в лямбда-функцию, которая имеет в качестве входной сигнал double и void *, а в качестве вывода - double. Теперь все работает нормально, если я использую лямбду без какого-либо захвата переменной. Но если я выполняю переменную захвата, она больше не работает.Численное интегрирование лямбда-функции с gsl
Может ли кто-нибудь объяснить мне, почему так?
Вот два фрагмента кода, который я сделал, чтобы объяснить мою проблему:
Это один работает отлично:
int main(int argc, char **argv)
{
double beg = 0;
double end = 10;
auto f = [] (double x, void * p) {return 2.0;};
gsl_integration_workspace * w = gsl_integration_workspace_alloc (GSL_INTEGRATION_WORKSPACE_SIZE);
double result;
double error;
gsl_function F;
F.function = f;
F.params = NULL;
gsl_integration_qags (&F, beg, end, 0, GSL_INTEGRATION_RELATIVE_PRECISION, GSL_INTEGRATION_WORKSPACE_SIZE, w, &result, &error);
cout<<result<<endl;
}
В то время как это один
int main(int argc, char **argv)
{
double beg = 0;
double end = 10;
double p = 2.0;
auto f = [&] (double x, void * p) {return p;};
gsl_integration_workspace * w = gsl_integration_workspace_alloc (GSL_INTEGRATION_WORKSPACE_SIZE);
double result;
double error;
gsl_function F;
F.function = f;
F.params = NULL;
gsl_integration_qags (&F, beg, end, 0, GSL_INTEGRATION_RELATIVE_PRECISION, GSL_INTEGRATION_WORKSPACE_SIZE, w, &result, &error);
cout<<result<<endl;
}
Урожайность на линии
F.function = f;
следующее сообщение об ошибке:
Assigning to 'double (*)(double, void *)' from incompatible type '<lambda at /[omissis]/main.cpp>'
Это именно то, что я искал! –
Если вам понравилось, вы можете дать голосование другим ответам :) –
где находится 'std :: function'? – Walter