関数をgslと統合したいと思います。そのために私は関数f
を定義しなければなりません(これは、double (*)(double, void*)
の形式でなければなりません)。 gslの統合メソッドの呼び出しでは、関数へのポインタを含む構造体を定義する必要があります(この構造体はgsl_function
と呼ばれています)。オブジェクトのメンバ関数へのポインタ
gsl_function F;
F.function = &MyClass::my_f;
関数f
は(統合手順が呼び出されるべきと同じクラスに)クラスに実装されなければなりません。ここで
cannot convert ‘double (MyClass::*)(double, void*)’ to ‘double (*)(double, void*)’ in assignment.
my_f
struct my_f_params { double a; double b;};
double my_f (double x, void * p) {
struct my_f_params * params = (struct my_f_params *)p;
double a = (params->a);
double b = (params->b);
return 1.0/(sqrt(a * (1.0 + x)*(1.0 + x)*(1.0 + x) + (1-a) * std::pow((1.0 + x), (3.0 * (1.0 + b)))));
}
コールバックとして「静的」メンバー関数を用意する必要があります。 'void *'パラメータは、必要に応じて 'this'ポインタを渡すために(誤って)使われることがあると思います。 –
メンバへのポインタは通常のポインタではありません。フラットな関数の中にラップする必要があります。この技術の多くの例がSOにあります。 –
'gsl_function :: function'の' void * 'パラメータについて考えてみましょう。それはおそらく何のために使われますか? –