gpt4 book ai didi

pointers - 通用 Lisp CFFI : pointer to the pointer

转载 作者:行者123 更新时间:2023-12-03 23:25:04 26 4
gpt4 key购买 nike

我正在尝试为 Sundials CVODE 编写 CFFI 包装器图书馆。 SWIG 被 Sundial header 阻塞,因为它们相互关联,并且 SWIG 找不到合适的 header ,所以我手工完成:有点费力,但我已经做到了。

现在我正在尝试测试它是否正常工作。现在,只需简单地创建“问题对象”并删除它。这就是问题开始的地方。因此,“问题对象”是通过函数分配的

SUNDIALS_EXPORT void *CVodeCreate(int lmm, int iter);

我为其创建了包装器:
(cffi:defcfun "CVodeCreate" :pointer
(lmm :int)
(iter :int))

附注。 SUNDIALS_EXPORT (至少在 Unix 上)基本上什么都没有。

现在,为了销毁对象,Sundials 使用了它自己的函数:
SUNDIALS_EXPORT void CVodeFree(void **cvode_mem);

所以,我需要将它传递给 CVodeCreate 创建的对象的引用。 .在 C 中,如果我的内存没有问题,我会做类似 CVodeFree(&problem_object) 的事情。 .在 CL 中,我为函数编写了这个包装器:
(cffi:defcfun "CVodeFree" :void
(cvode-mem :pointer))

所以,这里 COVDE-MEM是一个指向指针的指针。问题是如何获取CL/CFFI中指针的指针?这是代码的开头:
(defvar *p* (cvodecreate 1 2))

(PS。不要​​担心传递给 CVODECREATE 的数字,它们只是告诉使用哪些方法,仍然需要定义常量以使其更具可读性)

所以 *P*就像
#.(SB-SYS:INT-SAP #X7FFFE0007060)

如果我直接传给 CVODEFREE ,它以错误结束:
CL-USER> (cvodefree *p*)
; Evaluation aborted on #<SIMPLE-ERROR "bus error at #X~X" {1005EC9BD3}>.

我试过通过 (CFFI:POINTER-ADDRESS *P*)但它导致类似的“总线错误...”(甚至不确定这个函数是否返回我需要的)。我也试过 (CFFI:MAKE-POINTER (CFFI:POINTER-ADDRESS *P*)) ,再次没有任何成功。

This question建议这种方法:
(cffi:with-foreign-object (p :pointer)
(setf (cffi:mem-ref p :pointer) (cvodecreate 1 2))
(cvodefree p))

这有效(至少它不会引发错误)。我想我明白它是如何工作的:它创建(为其分配内存)一个指向指针的指针 P ,其 MEM-REF (或在 C 术语中将取消引用 *p )由 CVODECREATE 上的结果填充.最后,我将这个指向指针的指针传递给 CVODEFREE ,这正是这一点。最后分配给 P的内存表单完成后释放。这是正确的方法吗?这是我唯一可以接受的吗?

最佳答案

是的,你的方法看起来是正确的,这里有一个小测试来展示可以直接从 repl 运行的概念。

(let* (;; a float
(v0 32s0)

;; a pointer to a float foreign memory
(p0 (cffi:foreign-alloc :float :initial-element v0)))

;; a new pointer
(cffi:with-foreign-object (p1 :pointer)

;; make the new pointer point to the first pointer
(setf (cffi:mem-aref p1 :pointer) p0)

;; dereferencing twice should give you the original number
(cffi:mem-aref (cffi:mem-aref p1 :pointer) :float)))

附言我相信你现在已经知道了,抱歉花了这么长时间才给你答复。希望这可以帮助其他人

关于pointers - 通用 Lisp CFFI : pointer to the pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35841771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com