Как да конвертирам lua низ в C char*?

Използвах библиотеката 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 има нещо, което да преобразува цели низове в байтови масиви или нещо, което бих могъл да манипулирам достатъчно.

Някакви съвети как мога да направя това от страна на lua, без да променям C кода?


person BarFooBar    schedule 02.11.2015    source източник
comment
Разгледахте ли документацията за API?   -  person wallyk    schedule 02.11.2015
comment
Използвам LuaJIT ffi библиотека и документацията там не е толкова полезна.   -  person BarFooBar    schedule 02.11.2015


Отговори (2)


Не можете да подадете Lua низ към функция ffi, която очаква char* директно. Първо трябва да преобразувате низа на Lua в char*. За да направите това, създайте нова C string променлива с ffi.new и след това копирайте съдържанието на вашата Lua string променлива в тази нова C string променлива . Например:

local text = "text"
local c_str = ffi.new("char[?]", #text)
ffi.copy(c_str, text)
lib.drawText(fb, px, py, c_str, color)
person Diego Pino    schedule 02.11.2015

Като алтернатива, пренапишете вашата C функция, за да приемете const char* вместо char*. След това можете да използвате LuaJIT низове директно, без да е необходимо първо да заделяте буфер за тях.

Това означава, че функцията не може да променя подадения низ, но обикновено не правите това в повечето функции. Също така се изисква в по-новите версии на C, ако искате да предадете низови литерали (тъй като те са от типа const char*), и в противен случай добър дизайн на API.

Преобразуването е документирано в Преобразуване от Lua обекти към C типове на FFI Semantics страница.

person Colonel Thirty Two    schedule 02.11.2015
comment
Бях в процес на писане на същото нещо :) Вероятно дори не трябва да пренаписвате вашата C функция, ако знаете, че тя не променя низа, просто добавете const към шаблона в кода на Lua (ffi.cdef). - person catwell; 03.11.2015