我一直在谷歌上搜索,哦,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))
这会生成一个带有插槽的结构“VECT”:X和:Y,外部插槽名称确认(请注意我既没有生成绑定也没有编写C库(花栗鼠物理),但实际的功能正在从口角不清中调用就好了。
我搜索的范围很广,也许我已经看了100遍并且掩盖了它,但我无法弄清楚如何在lisp中创建一个cpVect实例以用于其他功能。
注意功能:
cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset)
不仅需要一个cpVect,还需要一个指向一组cpVects的指针,这引出了我的第二个问题:如何创建指向一组结构的指针?
我去过http://common-lisp.net/project/cffi/manual/html_node/defcstruct.html并尝试了代码,但得到“错误:未绑定变量:PTR”(我在Clozure CL中),更不用说看起来只返回指针,而不是实例
我是lisp的新手,到目前为止一直非常强大,但这是我遇到的第一个真正的问题,我无法弄明白。谢谢!
答案 0 :(得分:2)
大多数Common Lisp实现都不允许在堆栈上传递结构。有一个fsbv library使用libffi来添加该功能。如果您知道结构布局,可以将其作为一系列基本参数手动分解,但这显然很脆弱。
答案 1 :(得分:1)
不确定这会有多大帮助,但你可以看一下chipmunk的ruby FFI绑定: https://github.com/shawn42/chipmunk-ffi/blob/master/lib/chipmunk-ffi/vec2.rb
Chipmunk有一个数据部分,它具有所有内联方法调用,因此FFI可以使用它们。其中一个叫做cpv。 cpv是创建cpVect结构的方法。随意在github w / me(shawn42)上开始讨论这个问题。