[cffi-devel] Re: CFFI and GSL (spline function) help needed
Heiko Schroeter
schroete at iup.physik.uni-bremen.de
Thu Apr 27 12:40:59 UTC 2006
James Bielman <jamesjb <at> jamesjb.com> writes:
> > /* available types */
> > GSL_VAR const gsl_interp_type * gsl_interp_cspline;
>
>
> It looks like "gsl_interp_cspline" is a global variable, not a type,
> so you probably want to be doing something like:
>
> (defcvar "gsl_interp_cspline" :pointer)
>
> That should define a symbol macro *GSL-INTERP-CSPLINE* that will get
> the value of that C variable as a foreign pointer (I must admit, it
> seems a little weird to me to name the symbol macro with the special
> variable naming convention, since it's not actually special...)
>
> James
>
This seems to work ! Thanks a lot.
A quick and manual hack as a test is here (a bit ugly, but just for a start...)
(unless (find-package 'cffi)
(asdf:oos 'asdf:load-op :cffi))
(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)
;;;;
;;;(defcfun "gsl_sf_bessel_J0" :double (x :double))
;;;(time (format t "~A~%" (gsl-sf-bessel-J0 5d0)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; declare stuff
(defcfun "gsl_interp_accel_alloc" :pointer)
(defcvar "gsl_interp_cspline" :pointer)
(defcfun "gsl_spline_alloc" :pointer
(ptr :pointer)
(n :int))
(defcfun "gsl_spline_init" :int
(ptr :pointer)
(x :pointer)
(y :pointer)
(n :int))
(defcfun "gsl_spline_eval" :double
(spla :pointer)
(xi :double)
(acca :pointer))
(defcfun "gsl_spline_free" :void
(ptr :pointer))
(defcfun "gsl_interp_accel_free" :void
(ptr :pointer))
;;; Main Starts here
(defparameter *gsl-int-acc-alloc* (gsl-interp-accel-alloc))
(defparameter *gsl-spline-alloc* (gsl-spline-alloc *gsl-interp-cspline* 5))
(defparameter *xarray* (foreign-alloc :double :initial-contents '(1d0 2d0 3d0
4d0 5d0)))
(defparameter *yarray* (foreign-alloc :double :initial-contents '(1d1 2d1 3d1
4d1 5d1)))
(gsl-spline-init *gsl-spline-alloc* *xarray* *yarray* 5)
(format t "~A~%" (gsl-spline-eval *gsl-spline-alloc* 3.4d0
*gsl-int-acc-alloc*))
(foreign-free *xarray*)
(foreign-free *yarray*)
(gsl-spline-free *gsl-spline-alloc*)
(gsl-interp-accel-free *gsl-int-acc-alloc*)
Heiko
More information about the cffi-devel
mailing list