Как вы присваиваете struct пустоте в интеграции gsl

#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;
}
  

ДЕМОНСТРАЦИЯ