Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
公共lisp、CFFI和实例化c结构_C_Lisp_Common Lisp_Chipmunk_Ffi - Fatal编程技术网

公共lisp、CFFI和实例化c结构

公共lisp、CFFI和实例化c结构,c,lisp,common-lisp,chipmunk,ffi,C,Lisp,Common Lisp,Chipmunk,Ffi,我在google上搜索这个“问题”的解决方案已经有3个小时了,我想知道如何用CFFI在lisp中实例化C结构。我有一个c结构: struct cpVect{cpFloat x,y;} 简单对吧?我已经自动生成了这个结构的CFFI绑定(我想是swig): (cffi:defcstruct #.(chipmunk-lispify "cpVect" 'classname) (#.(chipmunk-lispify "x" 'slotname) :double) (#.(chipmun

我在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))
这将生成一个包含slot:X和:Y的结构“VECT”,外部slot名称证实了这一点(请注意,我既没有生成绑定,也没有编写C库(chipmunk physics),但实际的函数可以从lisp中调用)

我已经搜索了很多地方,也许我已经看过它100次了,但我不知道如何在lisp中创建一个cpVect实例,以便在其他函数中使用

请注意以下功能:

cpShape *cpPolyShapeNew(cpBody *body, int numVerts, cpVect *verts, cpVect offset)
不仅需要一个cpVect,还需要一个指向一组cpVect的指针,这就引出了我的第二个问题:如何创建指向一组结构的指针

我已经访问并尝试了代码,但是得到了“Error:unboundvariable:PTR”(我在Clozure CL中),更不用说它看起来只返回一个指针,而不是一个实例


我是lisp的新手,到目前为止,我的口齿不清,但这是我遇到的第一个我无法解决的真正问题。谢谢

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

不确定这会有多大帮助,但您可以查看用于chipmunk的ruby FFI绑定:


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

事实证明,CFFI绑定实际上是断开的,因此每次需要一个cpVect时,都将vect-x和vect-y作为单独的参数传递(解决了在堆栈上创建的问题)。就分配指针而言,CFFI工作得很好。适用于指针集合…解决了一半问题。非常感谢。原来我根本不需要在堆栈上分配,但你的回答让我更深入地挖掘。非常感谢。