【问题标题】:How do I convert a lua string to a C char*?如何将 lua 字符串转换为 C char*?
【发布时间】:2016-02-02 18:38:56
【问题描述】:

我使用了 luajit ffi 库来包装一个 C 库,其中包含一个在 ppm 文件上绘制文本的函数:

void drawText(frameBuffer *fb, int px, int py, char* text, pixel color) 

当我尝试使用字符串从 lua 调用它时,我收到此错误 bad argument #4 to 'drawText' (cannot convert 'string' to 'char *')。 lua 字符串库似乎没有任何东西可以将整个字符串转换为字节数组或任何我可以充分操作的东西。

关于如何在不修改 C 代码的情况下在 lua 端执行此操作的任何提示?

【问题讨论】:

标签: c lua ffi luajit


【解决方案1】:

您不能将 Lua string 传递给直接需要 char* 的 ffi 函数。您需要先将 Lua string 转换为 char*。为此,请使用 ffi.new 创建一个新的 C string 变量,然后将 Lua string 变量的内容复制到这个新的 C string 变量。例如:

local text = "text"
-- +1 to account for zero-terminator
local c_str = ffi.new("char[?]", #text + 1)
ffi.copy(c_str, text)
lib.drawText(fb, px, py, c_str, color)

【讨论】:

    【解决方案2】:

    或者,重写您的 C 函数以接受 const char* 而不是 char*。然后就可以直接使用 LuaJIT 字符串了,不需要先为它们分配缓冲区。

    这意味着该函数不能修改传递的字符串,但无论如何您通常不会在大多数函数中这样做。如果您希望传入字符串字面量(因为它们的类型为 const char*),那么在较新版本的 C 中也需要它,以及其他良好的 API 设计。

    转换记录在Conversion from Lua objects to C types of the FFI Semantics page

    【讨论】:

    • 我正在写同样的东西 :) 你可能甚至不必重写你的 C 函数,如果你知道它不会修改字符串,只需将 const 添加到Lua 代码中的模板 (ffi.cdef)。
    猜你喜欢
    • 1970-01-01
    • 2018-03-27
    • 2013-05-13
    • 2012-01-16
    • 2018-09-02
    • 2016-04-20
    • 2012-03-07
    • 1970-01-01
    • 2010-11-22
    相关资源
    最近更新 更多