From: Sam S. <sd...@gn...> - 2006-09-21 20:42:06
|
if I replace c-array-ptr with c-pointer and write (setf (slot (foreign-value ret) 'y) (list-to-vector y))) it appears to work - but this is somewhat ugly... Sam Steingold wrote: > so, what is wrong with this code: > > (def-c-type node (c-struct list (index int) (value double-float))) > (def-c-type problem (c-struct list > (l int) ; number of records > (y (c-array-ptr double-float)) ; of length l (targets) > (x (c-array-ptr (c-array-ptr node))))); of length l (predictors) > > (defun alist-to-nodes (alist) > ;; Lisp ((index . value) ...) --> C [index;value]...[-1;*] > (let* ((len (length alist)) > (ret (allocate-shallow 'node :count (1+ len)))) > (with-c-place (v ret) > (loop :for i :upfrom 0 :for (index . value) :in alist :do > (setf (slot (element v i) 'index) index > (slot (element v i) 'value) value)) > (setf (slot (element v len) 'index) -1)) > ret)) > > (defun list-to-vector (list) > ;; Lisp list --> C array > (let* ((len (length list)) (ret (allocate-shallow 'double-float > :count len))) > (with-c-place (v ret) > (loop :for i :upfrom 0 :for value :in list :do > (setf (element v i) value))) > ret)) > > (defun make-problem (&key l y x) > (let ((ret (allocate-shallow 'problem))) > (setf (slot (foreign-value ret) 'l) l > (slot (foreign-value ret) 'y) > (offset (foreign-value (list-to-vector y)) 0 > `(c-array double-float ,l)) ; FIXME!! > (slot (foreign-value ret) 'x) > (offset (foreign-value (alist-to-nodes x)) 0 > `(c-array (c-ptr node) ,l))) ; FIXME!! > ret)) > |