gpt4 book ai didi

Racket FFI : initialize pointer to NULL

转载 作者:行者123 更新时间:2023-12-04 23:49:36 31 4
gpt4 key购买 nike

这是我第一次尝试使用 Racket 的 FFI。我想创建一个绑定(bind)到 libgit2 的应用程序为了操作 GIT 存储库。

我需要做的第一件事是初始化存储库 as shown in the libgit2 documentation :

git_repository *repo = NULL;
int error = git_repository_init(&repo, "/tmp/…", false);

在 Racket 中获取函数调用非常简单:

(require ffi/unsafe
ffi/unsafe/define)
(define-ffi-definer define-libgit (ffi-lib "/opt/local/lib/libgit2.dylib"))
(define _git_repository-ptr (_cpointer/null 'git_repository))
(define-libgit git_repository_init (_fun _git_repository-ptr _string _bool -> _int))

但是随后尝试使用该功能不起作用:
-> (define new_repo _git_repository-ptr)
-> (git_repository_init new_repo "/tmp/..." #f)
; git_repository->C: argument is not `git_repository' pointer
; argument: #<ctype>
; [,bt for context]
libgit2不提供初始化指针的函数, as shown in the Racket FFI documentation example .

这是定义可空指针并将其初始化为 NULL 的正确方法吗? ?
git_repository ,另一方面,是 struct在库中定义。我应该使用 define-cstruct在 Racket 方面正确获得它?这可能很麻烦,因为 struct是根据其他 struct 定义的s,有一些嵌套级别。有什么模式可以处理这种情况吗?

最佳答案

问题不在于指针没有初始化为空;事实上, git_repository_init 文档并没有说它必须初始化为任何东西。问题是它是一个输出参数,而您的函数声明没有指定。

这是我测试过的一些代码(在 Ubuntu 14.04 上)对我有用:

> (require ffi/unsafe ffi/unsafe/define) 
> (define-ffi-definer define-libgit (ffi-lib "libgit2"))
> (define _git_repository-ptr (_cpointer/null 'git_repository))
> (define-libgit git_repository_init (_fun (repo : (_ptr o _git_repository-ptr)) _string _bool -> (rc : _int) -> (values repo rc)))
> (git_repository_init "/tmp/repo" #f)
#<cpointer:git_repository>
0

请参阅 _ptr 的文档关于如何指定 out 参数。 (您也可以使用它来指定输入/输出参数,但这些通常很少见。)

(当然,你最终会想要修改你的 FFI,而不是像我的示例那样返回两个值,而是简单地检查返回代码是否有错误,适本地引发适当的 Racket 错误,然后只返回如果成功,则存储库指针。)

关于 Racket FFI : initialize pointer to NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25743272/

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