Hello,
i want to use the GSL spline functionallity from within SBCL using the CFFI interface. So far i can do the "simple" functions returning pointers and/or values like the BESSEL function for example.
Now i 'am trying to setup an interface for the spline function but cannot manage to handle the "gsl_interp_cpline" pointer in lisp correctly. I did copy the needed parts here for simplicity:
/***************** gsl_types.h ************************/ <snip> # define GSL_VAR extern <snap> /***************** gsl_interp.h ***********************/ /* evaluation accelerator */ typedef struct { size_t cache; /* cache of index */ size_t miss_count; /* keep statistics */ size_t hit_count; } gsl_interp_accel;
/* interpolation object type */ typedef struct { const char * name; unsigned int min_size; void * (*alloc) (size_t size); int (*init) (void *, const double xa[], const double ya[], size_t size); int (*eval) (const void *, const double xa[], const double ya[], size_t size, double x, gsl_interp_accel *, double * y); int (*eval_deriv) (const void *, const double xa[], const double ya[], size_t size, double x, gsl_interp_accel *, double * y_p); int (*eval_deriv2) (const void *, const double xa[], const double ya[], size_t size, double x, gsl_interp_accel *, double * y_pp); int (*eval_integ) (const void *, const double xa[], const double ya[], size_t size, gsl_interp_accel *, double a, double b, double * result); void (*free) (void *);
} gsl_interp_type;
/* general interpolation object */ typedef struct { const gsl_interp_type * type; double xmin; double xmax; size_t size; void * state; } gsl_interp;
/* available types */ GSL_VAR const gsl_interp_type * gsl_interp_cspline;
gsl_interp_accel * gsl_interp_accel_alloc(void);
/********************** gsl_spline.h *********************************/ /* general interpolation object */
typedef struct { gsl_interp * interp; double * x; double * y; size_t size; } gsl_spline;
gsl_spline * gsl_spline_alloc(const gsl_interp_type * T, size_t size);
/********************* example.c **************************************/ <snip> gsl_interp_accel *acc = gsl_interp_accel_alloc (); gsl_spline *spline = gsl_spline_alloc (gsl_interp_cspline, 10); <snap> /*********************************************************************/
My lisp translation so far:
(defpackage :cffi-user (:use :common-lisp :cffi)) (in-package :cffi-user)
(pushnew #P"/usr/local/lib/" *foreign-library-directories* :test #'equal)
(define-foreign-library libgslcblas (:unix (:or "libgslcblas.so.0.0.0" "libgslcblas.so.0")) (t (:default "libgslcblas"))) (use-foreign-library libgslcblas)
(define-foreign-library libgsl (:unix (:or "libgsl.so.0.9.0" "libgsl.so.0")) (t (:default "libgsl"))) (use-foreign-library libgsl)
;;;; just to test the interface (defcfun "gsl_sf_bessel_J0" :double (x :double)) (format t "~A~%" (gsl-sf-bessel-J0 5d0)) ;;;; ok so far
(defcfun "gsl_interp_accel_alloc" :void) (defparameter *gsl-int-acc-alloc* (gsl-interp-accel-alloc)) ;;;; looks ok so far
(defctype gsl-cspline :pointer) <--- trouble
(defcfun "gsl_spline_alloc" :pointer (ptr :pointer) (n :int)) (defparameter *gsl-spline-alloc* (gsl-spline-alloc gsl-cspline 10))
My problem is that i cannot set this typed struc pointer "gsl_interp_cpline" correctly. Memory allocation ? What is the "magic" trick here ?
Heiko