2009-10-27 17 views
8
C API kullanarak

nasıl C API

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

gibi bir tablo oluşturmak istiyorum

kullanarak iç içe Lua tablo oluşturmak için?

Benim şu anki yaklaşımı

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); 

bir döngü içinde iç tablolar oluşturmaktır. Bu döngüden önce, 2 sayısal yuva için dış tablo oluşturmak için

kullanın.

Ancak iç tabloları dış tablaya nasıl kaydedebilirim?

cevap

17

İşte tabloların nasıl yuvalandığını gösteren tam ve minimal bir program. Temel olarak eksik olan şey, lua_setfield işlevidir.

#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; 
} 

programı basitçe true yazdırılır.

sayısal endekslerini gerekiyorsa, o zaman lua_settable kullanmaya devam:

#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; 
} 

Aksine benim yaptığım gibi 0'a mutlak endekslerini kullanmak yerine, dizini oluşturmak için lua_objlen kullanmak isteyebilirsiniz.

+0

lua_setfield ile sayısal göstergeler nasıl oluşturulur? – Etan

8

Verdiğiniz gibi basit bir kod için benim lua2c iyi çalışıyor ve aşağıdaki kodu üretir.

/* 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

Burada, lhf'nin yanıtına dayanan benzer bir sorunu çözmek için geldiğim genel bir şey var. Bu,

için rasgele tablo/alt tablo uzunluğu ile bir Lua tablosu oluşturacaktır.

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

C'ye benzemiyor. Uygun olmayan bir şekilde derleme yapmayın. – Kamiccolo

+0

Bu, C++ kullanarak eris'tir. – GunChleoc