4

我最近一直在玩奇妙的 cffi,但我在确定使用内置机制是否可以实现某些事情时遇到了问题。

我想创建一个外来向量数组并设置外来类型翻译,这样就可以了。

> (defparameter a (foreign-alloc 'vec3 :count 10))
A
> (setf (mem-aref  a 'vec3 4) (convert-to-foreign #(1.0 2.0 3.0) 'vec3))
#(1.0 2.0 3.0)
> (convert-from-foreign (mem-aref b 'vec3 4) 'vec3)
#(1.0 2.0 3.0

到目前为止,我有以下允许创建和获取外部 vec3 但不允许检索。

(defcstruct %vec3
  (components :float :count 3))

(define-foreign-type vec3-type ()
  ()
  (:actual-type %vec3)
  (:simple-parser vec3))

(defmethod translate-from-foreign (value (type vec3-type))
  (make-array 
   3 
   :element-type 'single-float
   :initial-contents (list (mem-aref value :float 0)
               (mem-aref value :float 1)
               (mem-aref value :float 2))))

问题是,虽然我可以轻松地设置一个函数来充当 vec3 的设置器,但我希望有一些我没有看到的内置方式来执行此操作。我已经阅读了 cffi 手册,并看到了 translate-to-foreign 方法以及 expand-to-foreign-dyn,但我还没有找到一种方法来使用基本上扩展为如下内容:

(let ((tmp (mem-aref a '%vec3 4)))
  (setf (mem-aref tmp :float 0) (aref lisp-value 0))
  (setf (mem-aref tmp :float 1) (aref lisp-value 1))
  (setf (mem-aref tmp :float 2) (aref lisp-value 2)))

这样就不会分配额外的内存并直接设置值。

好吧,这就是我的小白日梦,有人知道它是否可以工作吗?

4

1 回答 1

1

阅读了 CFFI 源代码,似乎内置机制不支持这一点。那里有处理数组类型的代码,但它没有公开或导出,因此显然不适合使用。还有一个建议的块存储器接口,但尚未编写。

所以这次没有骰子,但是 CFFI 很棒,所以我会用不同的方式来实现。

ps 还有WAAF-CFFI值得研究,但我还没有具体细节

于 2012-12-21T11:43:43.277 回答