如何在plt-scheme中通过ffi访问char **?

时间:2020-03-06 14:27:58  来源:igfitidea点击:

我正在用plt-scheme的ffi嘲笑,我有一个C函数返回一个char **(字符串数组)。如果我将函数声明为(_fun _pointer-> _pointer),如何将结果转换为scheme中的字符串列表?

以下是相关的C声明:

typedef char **MYSQL_ROW;   /* return data as array of strings */
// ...
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

解决方案

我知道这并不是我们要找的东西,但这可能会有所帮助。我已经完成了针对MySQL的基本Gambit Scheme FFI的一些工作。我不知道PLT Scheme和Gambit在FFI实施方面有何不同(我敢说"有点"),但也许我们可以从中得到一些帮助:

http://bunny.jonnay.net/zengarden/trunk/lib/mysql/mysql-ffi.scm

我认为我们想要的是cvector:

http://docs.plt-scheme.org/foreign/Derived_Utilities.html#(part._foreign~3acvector)

_string / utf-8的cvector或者我们需要的任何编码似乎都是合理的。

但这是根据我自己没有尝试过的文档的快速调查得出的。请让我知道它是否有效!

啊哈,我自己弄清楚了。

我必须使用迈克链接到的页面上描述的" _cpointer"过程:

(_fun _pointer -> (_cpointer/null 'mysql-row (make-ctype _pointer #f #f)))

似乎有人已经击败了我,为mysqlclient创建一个ffi。不要担心;我的主要目标是了解ffi api,并且它正在向前发展。