2016-09-13 1 views
4

Je voudrais avoir une fonction C retourner un tableau de table de chaînes (par exemple {"a", "b", "c"}) à un script Lua via LuaJIT.Retour d'un tableau de chaînes de C à LuaJIT via FFI

Quelle est la meilleure façon de le faire? J'ai pensé à retourner une seule chaîne concaténée avec un séparateur (par exemple "a|b|c"), puis je l'ai scindée en Lua, mais je me demandais s'il y avait une meilleure solution.

EDIT: J'utilise LuaJIT FFI pour appeler les fonctions C.

Répondre

3

Je pense que la meilleure façon d'y arriver serait d'avoir le code C retourner une struct contenant un tableau de chaînes et une longueur de Lua et écrire un peu Lua réifiez-le à votre structure de données souhaitée.

En C:

typedef struct { 
    char *strings[]; 
    size_t len; 
} string_array; 

string_array my_func(...) { 
    /* do what you are going to do here */ 
    size_t nstrs = n; /* however many strings you are returning */ 
    char** str_array = malloc(sizeof(char*)*nstrs); 
    /* put all your strings into the array here */ 
    return {str_array, nstrs}; 
} 

Dans Lua:

-- load my_func and string_array declarations 
local str_array_C = C.ffi.my_func(...) 
local str_array_lua = {} 
for i = 0, str_array_C.len-1 do 
    str_array_lua[i+1] = ffi.string(str_array_C.strings[i]) 
end 
-- str_array_lua now holds your list of strings 
+0

Merci. J'ai seulement dû déclarer "len" comme un int, au lieu de size_t, sinon j'ai une erreur dans "for ... do" (int est également nécessaire pour pouvoir gérer le cas du tableau vide, où str_array_C.len-1 est égal à -1). –

0

Essayez ce code C:

lua_newtable(L); 
lua_pushliteral(L,"a"); lua_rawseti(L,-2,1); 
lua_pushliteral(L,"b"); lua_rawseti(L,-2,2); 
lua_pushliteral(L,"c"); lua_rawseti(L,-2,3); 
return 1; 
+0

J'utilise luajit IFF pour appeler des fonctions C, et de revenir une seule chaîne de ma fonction C, je reviens tout simplement un const char *. Je ne sais pas comment intégrer votre code dans le framework LuaJIT FFI ... –