2015-11-02 1 views
3

J'ai utilisé la bibliothèque ffi luajit pour envelopper une bibliothèque C qui contient une fonction pour dessiner le texte sur un fichier ppm:Comment convertir une chaîne de caractères en un caractère C *?

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

Lorsque je tente de l'appeler de Lua en utilisant une chaîne que je reçois cette erreur bad argument #4 to 'drawText' (cannot convert 'string' to 'char *') . Il ne semble pas que la bibliothèque de chaînes lua ait quelque chose pour convertir des chaînes entières en tableaux d'octets ou tout ce que je pourrais manipuler suffisamment.

Des conseils sur la façon dont je pourrais faire cela du côté de lua sans modifier le code C?

+0

Avez-vous regardé la [documentation de l'API] (http://www.lua.org/manual/5.2/manual.html#4)? – wallyk

+0

J'utilise LuaJIT [bibliothèque ffi] (http://luajit.org/ext_ffi.html) et la documentation n'est pas aussi utile. – BarFooBar

Répondre

5

Vous ne pouvez pas passer une chaîne Lua à une fonction ffi qui attend un char * directement. Vous devez d'abord convertir le string en un char * en premier. Pour ce faire, créez une nouvelle variable C string avec ffi.new et ensuite copiez le contenu de votre variable Lua string à cette nouvelle variable C string. Par exemple:

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

Sinon, réécrivez votre fonction C pour accepter un const char* au lieu d'un char*. Ensuite, vous pouvez utiliser les chaînes LuaJIT directement, sans avoir besoin d'allouer un tampon pour celles-ci en premier. Cela signifie que la fonction ne peut pas modifier la chaîne transmise, mais vous ne le faites généralement pas dans la plupart des fonctions. Il est également requis dans les versions plus récentes de C si vous souhaitez transmettre des littéraux de chaîne (car ils sont du type const char*), et sinon une bonne conception d'API.

La conversion est documentée dans Conversion from Lua objects to C types of the FFI Semantics page.

+0

J'étais en train d'écrire la même chose :) Vous n'avez probablement même pas à réécrire votre fonction C, si vous savez qu'elle ne modifie pas la chaîne, ajoutez simplement 'const' au modèle dans le code Lua (' ffi.cdef'). – catwell