2010-10-21 34 views
5

J'ai créé une table Lua en C, mais je ne suis pas sûr de savoir comment pousser cette table sur le dessus d'une pile pour pouvoir la passer à une fonction Lua.Pousser une table Lua

Est-ce que quelqu'un sait comment faire cela?

Ceci est mon code actuel:

lua_createtable(state, libraries.size(), 0); 
int table_index = lua_gettop(state); 
for (int i = 0; i < libraries.size(); i++) 
{ 
    lua_pushstring(state, libraries[i].c_str()); 
    lua_rawseti(state, table_index, i + 1); 
} 

lua_settable(state, -3); 

[ Push other things ] 
[ Call function ] 

Répondre

7

est ici une fonction d'assistance rapide pour pousser les chaînes à la table

void l_pushtablestring(lua_State* L , char* key , char* value) { 
    lua_pushstring(L, key); 
    lua_pushstring(L, value); 
    lua_settable(L, -3); 
} 

J'utilise ici la fonction d'aide pour créer la table et le transmettre à une fonction

// create a lua function 
luaL_loadstring(L, "function fullName(t) print(t.fname,t.lname) end"); 
lua_pcall(L, 0, 0, 0); 

// push the function to the stack 
lua_getglobal(L, "fullName"); 

// create a table in c (it will be at the top of the stack) 
lua_newtable(L); 
l_pushtablestring(L, "fname", "john"); 
l_pushtablestring(L, "lname", "stewart"); 

// call the function with one argument 
lua_pcall(L, 1, 0, 0); 
+0

Comment est-ce que je pousserais deux tables différentes à la même fonction? –

+0

Le deuxième argument de lua_pcall est le nombre d'arguments transmis à la fonction, donc vous devez pousser les deux tables sur la pile et ensuite changer la pcall en lua_pcall (L, 2, 0, 0); –

1

Le tableau est déjà dans la pile, où lua_newtable a laissé, non?

+0

Si c'est le cas, je dois faire la table incorrectement. Pourriez-vous me dire comment je devrais créer la table? Tout ce qu'il doit contenir est quelques chaînes. –

+1

Voir http://www.lua.org/source/5.1/lua.c.html#getargs par exemple. Ou montrez-nous votre code. – lhf

1

J'ai fait un petit extrait open source qui résout en poussant de simples tables de dictionnaire Lua de C à Lua.

Vous pouvez le vérifier sur here, devrait bien fonctionner.