Hi,
I wanted to use GSL from Gambit but I am stuck at the point in which I need to pass a user defined function to some of the GSL procedures. Some take a data type gsl_function defined in the following way: double (* function) (double x, void * params). This is what I have done so far. (Not to add any suspense, I have to say it doesn't work.) My minimal solution consists in passing an int (*f)(int) function from Gambit to a the library function that takes as arguments a pointer to a function f and an integer and does nothing else than applying f to x.
I am now getting confused by the indirection:
(define gsl-func (c-lambda ( (function (int) int) int) int "gsl_func"))
is the Scheme binding to the C library function and
(c-define (helper-func f x) ( (function (int) int) int) int "helper_func" "" (f x))
is the helper function that will be called by the gsl procedure. This is the gsl procedure (which belongs to a shared library)
int gsl_func(int (*f)(int), int x) { int result = helper_func(f, x); //here result is f(x) return do_something(result); }
From Scheme, I would call
(gsl-func (lambda (x) (some-function-that-returns-an-int x)) an-int), and gsl-func would in turn call the helper function which calls the lambda form. Now when I compile and run it, gsi complains with
*** ERROR IN (console)@30.1 -- (Argument 1) Can't convert to C function (gsl-func '#<procedure #8 f> 4)
where 4 is the integer.
I found the following https://mercure.iro.umontreal.ca/pipermail/gambit-list/2009-March/003296.htm... but it doesn't allow to define more than one function at the time. How can I do it?
michele
Afficher les réponses par date