2017-09-13 1 views
2

J'ai 2 scripts, chacun dans un lua_State différent. J'essaye de pouvoir obtenir une variable d'un état et l'utiliser dans l'autre.Transfert de tableau lua multidimensionnel de lua_State à lua_State C++

Mon code ci-dessous fonctionne pour les variables uniques et les tableaux unidirectionnels. Pourrais-je obtenir des conseils pour que cela fonctionne également pour les tableaux multidimensionnels?

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

Malheureusement, je suis un moment difficile d'obtenir le droit de récursion pour que cela fonctionne pour les tableaux multidimensionnels.

+0

Ne serait-il pas plus facile d'utiliser 'lua_type' plutôt que de répéter les appels' lua_is * '? –

+0

Ouais cela pourrait être plus efficace étant donné que les entiers sont placés dans isstring puisque isstring est avant isnumber. –

Répondre

1

Résolu.

Pour tous ceux que cela pourrait être utile:

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

Attention: L1 et L2 doivent être différents états.

0

Vous pouvez lua_tinker::table:

+0

Il existe une autre méthode: * void getValues ​​(lua_State * L1, lua_State * L2, const char * cszFormat, ...) *, par exemple: cszFormat = "sd> ds", il y a deux entrées (chaîne, nombre) et deux sorties (nombre, chaîne) –