Ich möchte eine Funktion mit gsl integrieren. Dazu muss ich eine Funktion f
(der Integrant, der die Form double (*)(double, void*)
hat) definieren. Für den Aufruf der gsl-Integrationsmethode muss ich eine Struktur definieren, die einen Zeiger auf eine Funktion enthält (diese Struktur heißt gsl_function
).Zeiger auf Elementfunktion eines Objekts
gsl_function F;
F.function = &MyClass::my_f;
Die Funktion f
muss (von denen in der gleichen Klasse soll das Integrationsverfahren genannt werden) in einer Klasse implementiert werden. Wie kann ich den Zeiger oben richtig zuordnen, da die zweite Zeile nicht kompiliert und führt zu dem Fehler:
cannot convert ‘double (MyClass::*)(double, void*)’ to ‘double (*)(double, void*)’ in assignment.
Hier ist die Definition von 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)))));
}
Sie müssen dort eine 'statische' Mitgliedsfunktion als Callback bereitstellen. Ich nehme an, der 'void *' Parameter kann (falsch) verwendet werden, um den 'this' Zeiger nach Bedarf zu übergeben. –
Zeiger zu Mitgliedern sind keine normalen Zeiger. Sie müssen es in eine flache Funktion wickeln. Es gibt viele Beispiele für diese Technik auf SO. –
Denken Sie über den 'void *' Parameter von 'gsl_function :: function' nach. Wofür könnte es möglicherweise verwendet werden? –