2015-08-15 64 views
3

我有一个std::list对象,我想给Lua一个返回它的多维位置的函数。所以,我需要创建表的表:如何从C函数通过for循环返回一张表格到Lua

{{1,2,3...,512}, {1,2,3...,512},...,512} 

lua_newtable(L); 

    for (int i = 0; i < 512; i++) 
    { 
     lua_newtable(L); 

     lua_pushnumber(L, pos[i]); 
     lua_rawseti(L, -2, i); 
     lua_rawseti(L, -2, i+1); 

     for (int j = 0; j < 512; j++) 
     { 
       //pos[i][j] 
     } 
    } 

我想通过试错尝试,但因为我不知道该如何调试它,现在,我真的失去了。

+2

我认为你应该尝试对问题进行重新说明,使其更清楚。什么是“它的多维立场”。另外,什么是“对象”。在lua中,您只能推送lua原始类型,函数,用户数据....其他几个。你想要推送用户数据的东西,还是你有一些其他功能在手,知道如何推动它们?是你试图弄清楚的部分,还是主要是关于“如何使用C api制作表格表” –

+0

感谢您的关注。我将努力学习英语。 – Candy

回答

2

我想你想创建512x512尺寸的嵌套表(或矩阵)。

static int CreateMatrix(lua_State *L) { 
    lua_newtable(L); 
    for(int i = 0; i < 512; i++) { 
     lua_pushnumber(L, i + 1); // parent table index 
     lua_newtable(L);    // child table 
     for(int j = 0; j < 512; j++) { 
      lua_pushnumber(L, j + 1); // this will be the child's index 
      lua_pushnumber(L, j + 1); // this will be the child's value 
      lua_settable(L, -3); 
     } 
     lua_settable(L, -3); 
    } 
    return 1; 
} 

你当然可以使用你自己的值/索引。

+0

这就是我想要的。谢谢你,再次:) – Candy

0

由于您事先知道表的大小,因此可以避免使用lua_createtable重新分配内存,并使用rawseti来避免重新分配内存。

static int make_matrix(lua_State *L) { 
    lua_createtable(L, 512, 0); 
    for (int i = 0; i < 512; ++i) { 
     lua_createtable(L, 512, 0); 
     for (int j = 0; j < 512; ++j) { 
      lua_pushnumber(L, i + j); // push some value, e.g. "pos[i][j]" 
      lua_rawseti(L, -2, j + 1); 
     } 
     lua_rawseti(L, -2, i + 1); 
    } 
    return 1; 
}