gpt4 book ai didi

lisp - 使用 SBCL FFI 传递和接收字符串

转载 作者:太空宇宙 更新时间:2023-11-03 18:42:18 24 4
gpt4 key购买 nike

我有一个用优化的 c (library.c) 编写的复杂库:

#include <stdio.h>
#include "library.h"

void make_fullname(char* fullname, char* name, int version) {
sprintf(fullname, "%s-%d", name, version);
printf("lib-name: %s\n", name);
printf("lib-fullname: %s\n", fullname);
}

library.h 包含

void make_fullname(char* fullname, char* name, int version);

库编译如下:

gcc library.c -o library.so -shared

我正在尝试从 SBCL 使用它,这是我的最后一次尝试(我放弃并转向 stackoverflow 的一次):

(load-shared-object "library.so")

(define-alien-routine make_fullname void
(fullname (c-string :external-format :ascii))
(name (c-string :external-format :ascii))
(x int))


(defun print-name-version (name version)
(with-alien ((fullname (c-string :external-format :ascii)))
(setf fullname (make-alien char 100))
(setf fullname "dummy-string")
(make_fullname fullname name version)
(format t "~a~%" fullname)))

在运行时,例如,(print-name-version "Program"1) 我明白了

lib-name: Program
lib-fullname: Program-1
dummy-string
NIL

因此,除了将字符串传回 lisp 之外,一切正常。这个例子有什么问题?谢谢,安德烈。

更新 我已经让我的 lisp 代码可以工作了,但我仍然不明白为什么原始代码片段会失败。这是一个工作的:

(defun print-name-version (name version)
(let ((fullname (make-alien char 100)))
(make_fullname fullname name version)
(with-alien ((fn-str-repr (c-string :external-format :ascii) fullname))
(format t "~a~%" fn-str-repr))
(free-alien fullname)))

最佳答案

我从未使用过 SBCL native FFI 绑定(bind),但我想我明白了。为了将来引用,您将更有可能获得有关 CFFI 的帮助而不是实现特定的 FFI 绑定(bind)。

当从 Lisp 代码访问时,外来类型 c 字符串的变量会自动转换为 Lisp 字符串。顶层函数 make_fullname 是 Lisp 代码,依次调用 alien 例程,但此时 fullname 已被转换为 Lisp 字符串,然后被转换为 c 字符串,调用完成后将被丢弃。

您需要做您在编辑中所做的事情:分配存储缓冲区并将其传递给 alien 函数,并将关联的 c 字符串变量视为该存储上的 Lisp View 。

关于lisp - 使用 SBCL FFI 传递和接收字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9382735/

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