将多维lua数组从lua_State传递到lua_State C ++

时间:2017-09-13 19:26:49

标签: c++ lua

我有2个脚本,每个脚本都有不同的lua_State。

我试图从一个状态获取变量并在另一个状态中使用它。

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

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

不幸的是,我很难让这个递归适合多维数组。

2 个答案:

答案 0 :(得分:2)

解决。

对于任何可能有用的人:

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必须是不同的状态。

答案 1 :(得分:0)

您可以尝试lua_tinker::table: