#c #struct #void-pointers #gsl
#c #struct #void-указатели #gsl
Вопрос:
Я хочу использовать пакет gsl для численного интегрирования, что может показаться простым. Однако моя функция многопараметрическая. Я использую тип данных struct для параметров функции. Вот мой код для интеграции функции f = a * x b в качестве примера, который содержит параметры a и b.
#include <stdio.h>
#include <math.h>
#include <gsl/gsl_integration.h>
struct parameters { double a; double b;};
double func (double x, void * params) {
struct parameters alpha = *(struct parameters *) params;
double func = alpha->a*x alpha->b;
return func;
}
int main (void)
{
gsl_integration_cquad_workspace * w
= gsl_integration_cquad_workspace_alloc (100);
double result, error;
size_t neval;
struct parameters alpha = {10.0, 3.0};
gsl_function F;
F.function = amp;func;
F.params = amp;alpha;
gsl_integration_cquad(amp;F, 0, 1., 0., 1e-7, w, amp;result, amp;error, amp;neval);
printf ("result = % .18fn", result);
printf ("estimated error = % .18fn", error);
gsl_integration_cquad_workspace_free (w);
return 0;
}
Это, однако, не работает. Я не знаю, как интегрировать многопараметрические функции. Функция, которая названа здесь (func), имеет аргумент (void * params), который я всегда получаю с ошибкой при изменении его на переменную любого типа, отличную от указателя void, и я не могу назначить struct alpha, содержащую параметры a и b, этому указателю void.
Комментарии:
1. «Как вы назначаете struct для void» — это не имеет смысла .
void
означает «несуществующий» или «нет типа» или «ничего». Вы не можете назначить что-то ничему.2. Несвязанный: Сделайте
#include <cstdio>
вместо#include <stdio.h>
Ответ №1:
Вы неправильно выполнили приведение. Это:
struct parameters alpha = *(struct parameters *) params;
…должно быть написано, как показано ниже, если вы хотите скопировать params
в alpha
:
struct parameters alpha = *((struct parameters *) params);
…но позже вы используете alpha
в качестве указателя, так что это действительно должно быть так:
struct parameters* alpha = (struct parameters *) params;
Однако вы можете не использовать struct
при программировании C , поскольку структура typedef
редактируется автоматически. Вы также должны использовать приведения C :
double func(double x, void* params) {
auto alpha = static_cast<parameters*>(params);
return alpha->a * x alpha->b;
}
Вы также могли бы сделать alpha
ссылку:
double func(double x, void* params) {
autoamp; alpha = *static_cast<parameters*>(params);
return alpha.a * x alpha.b;
}