【问题标题】:Returning a string table array from C to LuaJIT via FFI通过 FFI 从 C 返回一个字符串表数组到 LuaJIT
【发布时间】:2017-01-20 22:29:41
【问题描述】:

我想让 C 函数通过 LuaJIT 将字符串表数组(例如 {"a", "b", "c"})返回到 Lua 脚本。

最好的方法是什么?

我想返回一个带有分隔符的单个连接字符串(例如"a|b|c"),然后在 Lua 中拆分它,但我想知道是否有更好的方法。

编辑:我正在使用 LuaJIT FFI 调用 C 函数。

【问题讨论】:

    标签: lua luajit


    【解决方案1】:

    我认为实现这一点最简单的方法是让 C 代码返回一个包含字符串数组和长度的结构体到 Lua,然后编写一个小 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)。
    猜你喜欢
    • 2016-10-11
    • 2012-12-10
    • 2017-06-03
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2019-11-15
    相关资源
    最近更新 更多