3

我已经在谷歌上搜索了大约 3 个小时来寻找这个“问题”的解决方案。我试图弄清楚如何使用 CFFI 在 lisp 中实例化 C 结构。我在c中有一个结构:

struct cpVect{cpFloat x,y;}

简单吧?我有这个结构的自动生成的 CFFI 绑定(我认为是 swig):

(cffi:defcstruct #.(chipmunk-lispify "cpVect" 'classname)
    (#.(chipmunk-lispify "x" 'slotname) :double)
    (#.(chipmunk-lispify "y" 'slotname) :double))

这会生成一个带有插槽:X 和:Y 的结构“VECT”,foreign-slot-names 确认了该结构(请注意,我既没有生成绑定也没有编写 C 库(花栗鼠物理),但实际函数是从 lisp 调用的正好)。

我已经进行了广泛的搜索,也许我已经看过 100 次并忽略了它,但我无法弄清楚如何在 lisp 中创建一个 cpVect 实例以用于其他函数。

注意功能:

cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset)

不仅需要一个 cpVect,还需要一个指向一组 cpVect 的指针,这让我想到了第二个问题:如何创建指向一组结构的指针?

我去过http://common-lisp.net/project/cffi/manual/html_node/defcstruct.html并尝试了代码,但得到“错误:未绑定变量:PTR”(我在 Clozure CL),更不用说看起来只返回一个指针,而不是一个实例。

我是lisp的新手,到目前为止一直很强大,但这是我遇到的第一个真正的问题,我无法弄清楚。谢谢!

4

2 回答 2

2

大多数 Common Lisp 实现不允许在堆栈上传递结构。有一个fsbv 库使用 libffi 来添加该功能。如果您知道结构布局,您可以手动将其分解为一系列基本参数,但这显然很脆弱。

于 2010-12-31T13:16:09.333 回答
1

不确定这会有多大帮助,但您可以查看花栗鼠的 ruby​​ FFI 绑定: https ://github.com/shawn42/chipmunk-ffi/blob/master/lib/chipmunk-ffi/vec2.rb

Chipmunk 有一个数据部分,其中包含所有内联方法调用,因此 FFI 可以使用它们。其中之一称为cpv。cpv 是创建 cpVect 结构的方法。随时与我 (shawn42) 在 github 上就此展开对话。

于 2011-01-01T02:18:53.197 回答