通过FFI将C中的字符串表数组返回给LuaJIT

4
我希望有一个C函数能够返回一个字符串数组表格(例如{"a", "b", "c"}),通过LuaJIT将其传递给Lua脚本。
哪种方法是最好的呢?
我考虑过返回一个单一的连接字符串,使用一些分隔符(例如"a|b|c"),然后在Lua中进行拆分,但我想知道是否有更好的方法。
编辑:我正在使用LuaJIT FFI调用C函数。
1个回答

4
我认为最简单的方法是让C代码返回一个包含字符串数组和长度的结构体,并在Lua中编写一些代码将其转化为所需的数据结构。
在C中:
typedef struct {
    char *strings[];
    size_t len;
} string_array;

string_array my_func(...) {
    /* do what you are going to do here */
    size_t nstrs = n; /* however many strings you are returning */
    char** str_array = malloc(sizeof(char*)*nstrs);
    /* put all your strings into the array here */
    return {str_array, nstrs};
}

在Lua中:

-- load my_func and string_array declarations
local str_array_C = C.ffi.my_func(...)
local str_array_lua = {}
for i = 0, str_array_C.len-1 do
    str_array_lua[i+1] = ffi.string(str_array_C.strings[i])
end
-- str_array_lua now holds your list of strings

谢谢。我只需要将“len”声明为int,而不是size_t,否则在“for ... do”中会出现错误(还需要int才能处理空数组情况,其中str_array_C.len-1等于-1)。 - Enrico Detoma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接