传输多维LUA阵列从lua_State到lua_State C++

问题描述:

我有2个脚本,每个在不同的lua_State。传输多维LUA阵列从lua_State到lua_State C++

我试图能够从一个状态获取变量,并在其他使用它。

我的代码如下适用于单变量和单向数组。我是否也可以获得一些指导,使其适用于多维数组?

void getValues(lua_State* L1, lua_State* L2, int& returns) 
{ 
    if (lua_isuserdata(L1, -1)) 
    { 
     LuaElement* e = Luna<LuaElement>::to_object(L1, -1); 
     if (e != NULL) 
     { 
      Luna<LuaElement>::push_object(L2, e); 
     } 
    } 
    else if (lua_isstring(L1, -1)) 
    { 
     lua_pushstring(L2, lua_tostring(L1, -1)); 
    } 
    else if (lua_isnumber(L1, -1)) 
     lua_pushnumber(L2, lua_tonumber(L1, -1)); 
    else if (lua_isboolean(L1, -1)) 
     lua_pushboolean(L2, lua_toboolean(L1, -1)); 
    else if (lua_istable(L1, -1)) 
    { 
     lua_pushnil(L1); 
     lua_newtable(L2); 
     while (lua_next(L1, -2)) 
     { 
      getValues(L1, L2, returns); 

      lua_rawseti(L2,-2,returns-1); 
      lua_pop(L1, 1); 
     } 
     // lua_rawseti(L2,-2,returns); // this needs work 
    } 
    returns++; 
} 

不幸的是,我很难得到这个适用于多维数组的递归权。

+0

使用'lua_type'而不是重复'lua_is *'调用会更容易吗? –

+0

是的,考虑到isstring在isnumber之前,整数放在isstring中可能更有效。 –

已解决。

对于任何人,这可能是有用的:

void getValues(lua_State* L1, lua_State* L2, int ind) 
{ 
    if (lua_type(L1, -1) == LUA_TTABLE) 
    { 
     lua_newtable(L2); 
     lua_pushnil(L1); 
     ind = 0; 
     while (lua_next(L1, -2)) 
     { 
      // push the key 
      if (lua_type(L1, -2) == LUA_TSTRING) 
       lua_pushstring(L2, lua_tostring(L1, -2)); 
      else if (lua_type(L1, -2) == LUA_TNUMBER) 
       lua_pushnumber(L2, lua_tonumber(L1, -2)); 
      else 
       lua_pushnumber(L2, ind); 

      getValues(L1, L2, ind++); 
      lua_pop(L1, 1); 

      lua_settable(L2, -3); 
     } 
    } 
    else if (lua_type(L1, -1) == LUA_TSTRING) 
    { 
     lua_pushstring(L2, lua_tostring(L1, -1)); 
    } 
    else if (lua_type(L1, -1) == LUA_TNUMBER) 
    { 
     lua_pushnumber(L2, lua_tonumber(L1, -1)); 
    } 
    else if (lua_type(L1, -1) == LUA_TBOOLEAN) 
    { 
     lua_pushboolean(L2, lua_toboolean(L1, -1)); 
    } 
    else if (lua_type(L1, -1) == LUA_TUSERDATA) 
    { 
     // replace with your own user data. This is mine 
     LuaElement* e = Luna<LuaElement>::to_object(L1, -1); 
     if (e != NULL) 
     { 
      Luna<LuaElement>::push_object(L2, e); 
     } 
    } 
} 

警告:L1和L2必须是不同的状态。

您可以试试lua_tinker::table:

+0

有一个另一种方法:*空隙的GetValues(lua_State * L1,lua_State * L2,常量字符* cszFormat,...)*,例如:cszFormat = “SD> DS”,有两个输入(字符串,号码)和两个输出(数字,字符串) –