Common Lisp 中指向外部字符串的指针

问题描述 投票:0回答:1

使用 SBCL,我尝试使用此签名调用 GStreamer 函数:

void gst_init (int *argc, char **argv[]);

所以我根据我所看到的here

编写了这个界面代码(简化)
(cffi:defcfun gst-init :VOID
  (argc :POINTER :INT)
  (argv :POINTER :STRING))
(defun start-gstreamer ()
   (cffi:with-foreign-object (argc :INT)
     (setf (cffi:mem-ref argc :INT) 1)
     (cffi:with-foreign-string (options "foo ")
       (cffi:with-foreign-object (poptions :POINTER)
         (setf (cffi:mem-ref poptions :POINTER) options)
         (gst-init argc poptions)))))

但是当我运行它时,我得到一个“内存错误”,它引用了一个地址,结果是一个 ASCII 字符串“oof”,与原始字符串相反。 看来我还需要另一层间接。 或者 defcfun 可能是错误的。 我该如何实现这个目标?

pointers common-lisp sbcl cffi
1个回答
0
投票

在寻找在 c 函数中访问双 ** 的解决方案时,我遇到了这个查询。

我已经在我的应用程序中使用 sbcl 中的代码解决了这个问题:

;;; command-line args (max 32)
(defvar *argc* (length *posix-argv*))
(let ((args (make-alien (array c-string 32))))
(loop for n from 0 to *argc*
      do (setf (deref (deref args) n)
               (nth n *posix-argv*)))
(defvar *argv* (cast args (* c-string))))

这样我就可以将

*argc*
*argv*
传递给我的 C 函数。

不幸的是,我无法解决像这样的函数的更困难的情况(示例案例)

static double array[10];
int getArray(double **ar) {
  *ar = array;
  return 10;
}

代码采用双指针并用数组的地址填充它。

但是嘿,我希望我的上述解决方案对您有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.