2009-10-27 18 views
8

Quiero crear una tabla comocómo crear tablas anidadas Lua usando la API C

myTable = { 
    [0] = { ["a"] = 4, ["b"] = 2 }, 
    [1] = { ["a"] = 13, ["b"] = 37 } 
} 

mediante la API de C?

Mi enfoque actual es

lua_createtable(L, 0, 2); 
int c = lua_gettop(L); 
lua_pushstring(L, "a"); 
lua_pushnumber(L, 4); 
lua_settable(L, c); 
lua_pushstring(L, "b"); 
lua_pushnumber(L, 2); 
lua_settable(L, c); 

para crear las tablas internas en un bucle. Antes, este ciclo, uso

lua_createtable(L, 2, 0); 
int outertable = lua_gettop(L); 

para crear la tabla externa para 2 ranuras numéricas.

Pero, ¿cómo puedo guardar las tablas internas en la mesa exterior?

Respuesta

17

Aquí hay un programa completo y mínimo que demuestra cómo anidar tablas. Básicamente lo que te estás perdiendo es la función lua_setfield.

#include <stdio.h> 
#include "lua.h" 
#include "lauxlib.h" 
#include "lualib.h" 

int main() 
{ 
    int res; 
    lua_State *L = lua_open(); 
    luaL_openlibs(L); 

    lua_newtable(L); /* bottom table */ 

    lua_newtable(L); /* upper table */ 

    lua_pushinteger(L, 4); 
    lua_setfield(L, -2, "four"); /* T[four] = 4 */ 
    lua_setfield(L, -2, "T"); /* name upper table field T of bottom table */ 
    lua_setglobal(L, "t"); /* set bottom table as global variable t */ 

    res = luaL_dostring(L, "print(t.T.four == 4)"); 
    if(res) 
    { 
     printf("Error: %s\n", lua_tostring(L, -1)); 
    } 

    return 0; 
} 

El programa simplemente imprimir true.

Si necesita índices numéricos, y después continúa utilizando lua_settable:

#include <stdio.h> 
#include "lua.h" 
#include "lauxlib.h" 
#include "lualib.h" 

int main() 
{ 
    int res; 
    lua_State *L = lua_open(); 
    luaL_openlibs(L); 

    lua_newtable(L); /* bottom table */ 

    lua_newtable(L); /* upper table */ 

    lua_pushinteger(L, 0); 
    lua_pushinteger(L, 4); 
    lua_settable(L, -3); /* uppertable[0] = 4; pops 0 and 4 */ 
    lua_pushinteger(L, 0); 
    lua_insert(L, -2); /* swap uppertable and 0 */ 
    lua_settable(L, -3); /* bottomtable[0] = uppertable */ 
    lua_setglobal(L, "t"); /* set bottom table as global variable t */ 

    res = luaL_dostring(L, "print(t[0][0] == 4)"); 
    if(res) 
    { 
     printf("Error: %s\n", lua_tostring(L, -1)); 
    } 

    return 0; 
} 

En lugar de utilizar los índices absolutos de 0 como lo hice, es posible que desee utilizar lua_objlen para generar el índice.

+0

cómo crear índices numéricos con lua_setfield? – Etan

8

Para un código simple como el que diste, mi lua2c funciona bien y genera el siguiente código.

/* This C code was generated by lua2c from the Lua code below. 

myTable = { 
    [0] = { ["a"] = 4, ["b"] = 2 }, 
    [1] = { ["a"] = 13, ["b"] = 37 } 
} 
*/ 
static int MAIN(lua_State *L) 
{ 
lua_newtable(L); 
lua_pushnumber(L,0); 
lua_newtable(L); 
lua_pushliteral(L,"a"); 
lua_pushnumber(L,4); 
lua_pushliteral(L,"b"); 
lua_pushnumber(L,2); 
lua_settable(L,-5); 
lua_settable(L,-3); 
lua_pushnumber(L,1); 
lua_newtable(L); 
lua_pushliteral(L,"a"); 
lua_pushnumber(L,13); 
lua_pushliteral(L,"b"); 
lua_pushnumber(L,37); 
lua_settable(L,-5); 
lua_settable(L,-3); 
lua_settable(L,-5); 
lua_settable(L,-3); 
lua_setglobal(L,"myTable"); 
return 0; 
} 
2

Aquí hay algo genérico que surgió para resolver un problema similar, basado en la respuesta de lhf. Esto creará una tabla Lua para el formulario

{ 
    {"foo"}, 
    {"bar", "baz"} 
} 

Con tabla arbitraria/longitud de subtabla.

int list_of_lists_to_lua(lua_State* L, const std::vector<std::vector<std::string>>& convertme) { 
    lua_newtable(L); 
    int counter = 0; 
    for (const std::vector<std::string>& list : convertme) { 
     lua_pushnumber(L, ++counter); 
     lua_newtable(L); 
     int counter2 = 0; 
     for (const std::string& item : list) { 
      lua_pushnumber(L, ++counter2); 
      lua_pushstring(L, item); 
      lua_settable(L,-3); 
     } 
     lua_settable(L,-3); 
    } 
    return 1; 
} 
+0

No se parece a C. Tampoco se compila sin incluir correctamente. – Kamiccolo

+0

Esto es C++ usando eris. – GunChleoc

Cuestiones relacionadas