我在Google上呆了大约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))

这会生成一个带有插槽的struct“ vect”:x and:y,外国插槽名称确认的(请注意,我既不会生成绑定或编程C库(chipmunk Physics),但是从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的新手,到目前为止一直很强,但这是我遇到的第一个真正的问题,我无法弄清楚。谢谢!

有帮助吗?

解决方案

最常见的LISP实现不允许在堆栈上传递结构。有一个 FSBV库 它使用libffi添加了该功能。如果您知道结构布局,则可以将其作为一系列基本参数手动分解,但这显然很脆。

其他提示

不确定这会有所帮助,但是您可以查看chipmunk的Ruby FFI绑定:https://github.com/shawn42/chipmunk-ffi/blob/master/lib/chipmunk-ffi/vec2.rb

Chipmunk的数据部分具有所有内联方法调用,因此FFI可以使用它们。其中之一称为CPV。 CPV是创建CPVECT结构的方法。随时在Github(Shawn42)上启动有关此的对话。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top