Применение обратного вызова для вызова gsl_integration

0

Я новичок в c++, и я пытаюсь изменить код и использовать библиотеку gsl_integration для c в классе Cosmology. Чтобы назначить функции-члены для формирования указателя для gsl, я использовал процедуру обратного вызова, которую я нашел, просматривая в Интернете

Обновление: Cosmology.h

#include <cmath>
#include <gsl/gsl_integration.h>


struct CCallbackHolder
{
  Cosmology* cls;
  void* data;
};

class Cosmology {
private:
    static const double c = 299792458.0, Mpc2Km = 3.08567758e+19, Yrs2Sec = 3.15569e7;
    double H0 = 67.77, OmegaM = (0.022161+0.11889)/(H0*H0), OmegaL = 0.6914, OmegaG = 8.24e-5, OmegaK = 0.0009;
    double Ez(double z);
    double Hz(double z, void* params);
    static double CCallback(double z,void* param)
    {
      CCallbackHolder* h = static_cast<CCallbackHolder*>(param);
      return h->cls->Hz(h->data);
    }
public:
    double distH, timeH;
    Cosmology();
    Cosmology(double);
    Cosmology(double , double );
    Cosmology(double , double , double );
    Cosmology(double , double , double , double );
    Cosmology(double , double , double , double , double );
    double distC(double);
  } cosmo;

Cosmology.cpp

#include <cmath>
#include <gsl/gsl_integration.h>
#include "Cosmology.h"
#include<iostream>
using namespace std;
double Cosmology::Hz(double z, void* params)  {
    double result = 1.0/pow(OmegaL + pow(1.0+z,3.0)*OmegaM + pow(1.0+z,4.0)*OmegaG + pow(1.0+z,2.0)*OmegaK, 0.5);
    return result;
    }

double Cosmology::distC(double z) { 
    double lower_limit = 0.0, abs_error = 1.0e-8, rel_error = 1.0e-8, alpha = 0.0, result, error;
    gsl_integration_workspace *work_ptr = gsl_integration_workspace_alloc(1000);
    gsl_function Hz_function;
    void* params_ptr = &alpha;
    Hz_function.function = &Cosmology::CCallback;
    Hz_function.params = params_ptr;
    gsl_integration_qags(&Hz_function, lower_limit, z, abs_error, rel_error, 1000, work_ptr, &result, &error);
    return distH*result;
    }
using namespace std;    
int main () {
  Cosmology cosmo;
  cout << "Comoving Distance: " << cosmo.distC (0.3);
  return 0;
}

При попытке скомпилировать код возникают следующие ошибки:

Cosmology.h:10: error: ISO C++ forbids declaration of ‘Cosmology with no type
Cosmology.h:10: error: expected ‘; before ‘* token
Cosmology.h:16: error: ISO C++ forbids declaration of ‘constexpr with no type
Cosmology.h:16: error: expected ‘; before ‘double
Cosmology.h:17: error: ISO C++ forbids declaration of ‘constexpr with no type
Cosmology.h:17: error: expected ‘; before ‘double
In file included from Universe.cpp:3:
Cosmology.h: In static member function ‘static double Cosmology::CCallback(double, void*):

путем компиляции с этой строкой: g++ -Wall -pedantic Cosmology.cpp -o Cosmology std=c++0x. Как я могу исправить код?

  • 0
    Напишите комментарии в строках, на которые указывают ошибки.
  • 0
    Удален мой ответ, так как я забыл, что вы можете делать это только с целочисленными типами, а не с двойными. Кроме того, как и прежде: отметьте строки, на которые ссылаются ошибки, добавив комментарии.
Показать ещё 2 комментария
Теги:
callback
gsl

1 ответ

0

Основная проблема с вашей программой заключается в том, что вы инициализируете нестатические переменные, являющиеся членами класса, при их объявлении, что не является законной C++. Чтобы быть конкретным, проблема заключается в следующих строках:

static constexpr double c = 299792458.0, Mpc2Km = 3.08567758e+19, Yrs2Sec = 3.15569e7;

double H0 = 67.77, OmegaM = (0.022161+0.11889)/(H0*H0), OmegaL = 0.6914, OmegaG = 8.24e-5, OmegaK = 0.0009;

c, Mpc2Km, Yrs2Sec, H0, OmegaM, OmegaL, OmegaG, OmegaK нестатические, неконстантные и двойные. Если вы хотите их инициализировать (т.е. присваивать им значения), вы должны сделать это в конструкторе класса Cosmology или переместить их за пределы объявления класса и, таким образом, сделать их глобальными, но обратите внимание, что вам следует избегать глобальных переменных, если вы не знаете, что вы делаете и нет другого пути.

Если вы хотите инициализировать их в файле заголовка, как вы пытались сделать, они должны быть целочисленного типа - не будут работать для удвоений.

Вкратце: первая строка не будет работать, потому что тип двойной (только встроенные статические константные типы могут быть инициализированы внутри декларации класса); второй не будет работать, поскольку тип не const, нестатический и двойной.

Остальные ошибки, вероятно, исчезнут, как только эти строки будут исправлены.

  • 0
    Я обновил, я все еще получаю сообщения об ошибках!
  • 0
    Я обновил ответ. Кроме того, пожалуйста, не просто отредактируйте свой вопрос, заменив текст, но, если вы измените его, напишите, что вы сделали, и каковы новые ошибки - таким образом, легче следить за развитием проблемы.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню