我已经使用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端执行此操作的任何提示?
答案 0 :(得分:9)
或者,重写您的C函数以接受const char*
而不是char*
。然后你可以直接使用LuaJIT字符串,而不需要先为它们分配缓冲区。
这意味着该函数无法修改传递的字符串,但您通常不会在大多数函数中执行此操作。如果您希望传入字符串文字(因为它们属于const char*
类型),以及其他良好的API设计,那么在较新版本的C中也需要它。
转换记录在Conversion from Lua objects to C types of the FFI Semantics page。
中答案 1 :(得分:5)
您无法将Lua 字符串传递给直接需要 char * 的ffi函数。您需要先将Lua 字符串转换为 char * 。为此,请使用ffi.new
创建一个新的C 字符串变量,然后将Lua 字符串变量的内容复制到此新的字符串< / em>变量。例如:
local text = "text"
local c_str = ffi.new("char[?]", #text)
ffi.copy(c_str, text)
lib.drawText(fb, px, py, c_str, color)