【问题标题】:LuaJIT ffi : How to pass array of string to c functionLuaJIT ffi:如何将字符串数组传递给 c 函数
【发布时间】:2017-06-03 20:37:06
【问题描述】:

我想将存储字符串的 Lua 表传递给 c 函数。例如,如果我有

tStr = {"String1", "String2", "String3"}

如何传递给 C 函数。我想我必须打电话给 ffi.new 但我不确定是哪种类型..

local cVar = ffi.new("??" , tStr)  -- I am not sure what to pass as type 

参数

同样在 C 函数中,我不确定如何访问整个数据,它会是指向 string 的字符串指针,**str 吗??

void cFunction(**str); --What pointer type should be used here ??

... 如果我错过了一些明显的问题,我深表歉意。但我只是从 Lua 和 ffi 开始。所以我仍然不知道大多数事情..

【问题讨论】:

    标签: c lua ffi luajit


    【解决方案1】:

    这是一个简单的例子:

    local ffi = require"ffi"
    ffi.cdef"int execvp(const char*file, const char**argv);"
    local arg = ffi.new("const char*[3]", {"ls", "-l"})
    ffi.C.execvp(arg[0], arg)
    

    请注意常量 3(数组的大小)
    等于 2(从 Lua {"ls", "-l"} 传递的字符串数)
    加 1(数组中的最后一个元素实际上是一个零终止符)。

    【讨论】:

    • 你可能需要将{"ls", "-l"} 锚定到一个变量上,这样lua 就不会过早地gc 它。 const char* 将在表中保留指向这些字符串文字的指针。
    • @greatwolf - 一般来说,是的,必须保持对字符串的引用。但是只要包含它的函数(实际上是它的原型)没有被垃圾回收,字符串文字就会自动保持活动状态。
    • 这对我有用.. 另外,我刚刚发现,如果我们不想分配固定大小的数组,那么我们可以使用“const char *[?]”语法来使用 VLA然后传递元素的数量..
    猜你喜欢
    • 2019-09-21
    • 2017-04-05
    • 2015-09-09
    • 2013-06-27
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2016-12-08
    相关资源
    最近更新 更多