2015-11-02 5 views
3

Я использовал библиотеку LuaJIT FFI, чтобы обернуть библиотеки C, которая содержит функцию для рисования текста на ппй файл:Как преобразовать строку lua в C char *?

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

Когда я пытаюсь вызвать его из Lua, используя строку, я получаю эту ошибку bad argument #4 to 'drawText' (cannot convert 'string' to 'char *') , Это не похоже на то, что в библиотеке строк lua ​​есть что угодно, чтобы преобразовать целые строки в байтовые массивы или что-нибудь, что я мог бы манипулировать достаточно.

Любые советы о том, как я могу это сделать на стороне Lua без изменения кода C?

+0

Вы посмотрели [документацию для API] (http://www.lua.org/manual/5.2/manual.html#4)? – wallyk

+0

Я использую LuaJIT [ffi library] (http://luajit.org/ext_ffi.html]), и документация там не так полезна. – BarFooBar

ответ

5

Вы не можете передать Lua строку к функции FFI, ожидающий символ * непосредственно. Вам необходимо преобразовать строку Lua в char *. Для этого создайте новую переменную C с ffi.new и после этого скопируйте содержимое вашей строки Lua переменной этой новой строке C переменной. Например:

local text = "text" 
local c_str = ffi.new("char[?]", #text) 
ffi.copy(c_str, text) 
lib.drawText(fb, px, py, c_str, color) 
9

В качестве альтернативы, переписать функцию C, чтобы принять const char* вместо char*. Затем вы можете напрямую использовать строки LuaJIT, без необходимости сначала выделять для них буфер.

Это означает, что функция не может изменить переданную строку, но обычно вы не делаете этого в большинстве функций. Это также требуется в более новых версиях C, если вы хотите передать строковые литералы (как они относятся к типу const char*) и в противном случае хороший дизайн API.

Преобразование задокументировано в Conversion from Lua objects to C types of the FFI Semantics page.

+0

Я уже писал то же самое :) Вы, вероятно, даже не должны переписывать свою C-функцию, если знаете, что она не модифицирует строку, просто добавьте 'const' в шаблон в коде Lua (' ffi.cdef'). – catwell