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