[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Help-gsl] using gsl callback routine from c++ / pointer to member funct
From: |
Hershel Safer |
Subject: |
[Help-gsl] using gsl callback routine from c++ / pointer to member function |
Date: |
Wed, 13 Feb 2013 10:26:49 +0200 |
Hi folks,
I'm trying to use GSL's multimin routine from C++, but the same issue
arises with integration and any functionality that uses a callback function
to calculate a user function f(x). The calls to GSL and to the callback
function are in a class. I am using g++ 4.1.2 and GSL 1.13.
l define a function myF() to compute f(x), and pass GSL a pointer to myF().
The problem is that the compiler won't convert from "pointer to myF ()" to
the way that GSL declares the pointer. This is because C++ treats a
"pointer to member function" differently from how it treats a pointer to a
function that is not part of a class. I understand the C++ issue; I hope
that somebody on this list knows how to get around it.
Details:
Part 1
My code has the function
double myClass::myF(const gsl_vector * x, void * params) { code to
calculate f(X) }
GSL uses a struct gsl_multimin_function to incorporate relevant information
about the function to be minimized, including a pointer to myF(). I
instantiate this struct using:
gsl_multimin_function funcStruct;
Within the struct gsl_multimin_function, GSL declares the pointer to my
f(x) function as:
double (* f) (const gsl_vector * x, void * params);
When initializing the GSL minimization, I tell GSL where to find my
function by writing (following the example in the GSL manual, chapter 35):
funcStruct.f = &myClass::myF;
The compiler complains about the conversion between pointer types:
error: cannot convert double (myClass::*)(const gsl_vector*, void*) to
double (*)(const gsl_vector*, void*) in assignment
The question is how to tell GSL how to call myF().
Part 2
One suggestion that I found from a Google search is to use a typedef:
typedef double (myClass::* FPTR) (const gsl_vector*, void*);
FPTR fptr = &myClass::myF;
funcStruct.f = fptr;
But the compiler is smart enough to recognize that this is the same as the
straightforward approach, and it gives a similar error message to the above.
Part 3
Another suggestion was to make myF() static, ugly though that may be. I
tried that, and got an error message that the minimization routine could
not be found. Oddly, this was a runtime error. The linker did not complain,
so presumably it found the nmsimplex2 routine, but somehow the routine
could not be found at runtime.
In the code: const gsl_multimin_fminimizer_type *T =
gsl_multimin_fminimizer_nmsimplex2
Runtime error: Unrecognized symbol gsl_multimin_fminimizer_nmsimplex2
So: Has anybody gotten GSL callbacks to work in C++? If so, please tell me
how.
Thank you so much,
Hershel Safer
--
Hershel Safer, Ph.D.
address@hidden | +972-54-463-1977 | skype: hsafer
- [Help-gsl] using gsl callback routine from c++ / pointer to member function,
Hershel Safer <=