Pushing a Lua table
14,634
Solution 1
Here's a quick helper function to push strings to the table
void l_pushtablestring(lua_State* L , char* key , char* value) {
lua_pushstring(L, key);
lua_pushstring(L, value);
lua_settable(L, -3);
}
Here I use the helper function to create the table and pass it to a function
// 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);
Solution 2
The table is already in the stack, where lua_newtable
left it, isn't it?
Solution 3
I made a small snippet open source that solves pushing simple Lua dictionary tables from C to Lua.
You can check it out here, should work well.
Author by
Tom Leese
Software developer with an interest in Android and Web technologies. Currently studying at the University of Southampton. GitHub - MDN - Qt - Stack Overflow - Twitter
Updated on June 04, 2022Comments
-
Tom Leese almost 2 years
I have created a Lua table in C, but I'm not sure how to push that table onto the top of a stack so I can pass it to a Lua function.
Does anyone know how to do this?
This is my current code:
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 ]
-
Tom Leese over 13 yearsIf it is, I must be making the table incorrectly. Could you tell me how I should be creating the table? All it needs to contain is some strings.
-
lhf over 13 yearsSee lua.org/source/5.1/lua.c.html#getargs for instance. Or show us your code.
-
Tom Leese over 13 yearsHow would I push two different tables to the same function?
-
DaEagle over 13 yearsThe second argument in lua_pcall is the number of arguments being passed to the function so you would push both tables onto the stack and then change the pcall to lua_pcall(L, 2, 0, 0);