my_table =
{
{ name = "user 1", id = 23, mb = true, val = 33 },
{ name = "user 2", id = 4443, mb = false, val = 44 },
{ name = "user 4", id = 332, mb = true, val = 55 },
{ name = "user 5", id = 43234, mb = true, val = 66 },
}
Test2( my_table )
Lua & C++ как правильнее перенести таблицу из одной lua-vm в другую
Возникла необходимость перенести таблицу из одной VM lua в другую полностью. Вопрос на миллион: как это правильнее сделать??
Как создавать таблицы в С-функциях я разобрался быстро. Не пойму как выдёргивать их из стека...
т.е. вот, к примеру, есть такой Lua-шный код:
Код:
есть пример Си-шного кода, как выдёргивать имена типов в стеке
Код:
int __cdecl Test2(
lua_State *l
)
{
//lua_getglobal(l, "my_table");
int tIndex = lua_gettop(l);
lua_pushnil(l); // first key
while (lua_next(l, tIndex) != 0)
{
fprintf(stdout, "key %s, ", lua_typename(l, lua_type(l, -2)) );
fprintf(stdout, "value %s\n", lua_typename(l, lua_type(l, -1)) );
lua_pop(l, 1);
}
return ( 0 );
}
lua_State *l
)
{
//lua_getglobal(l, "my_table");
int tIndex = lua_gettop(l);
lua_pushnil(l); // first key
while (lua_next(l, tIndex) != 0)
{
fprintf(stdout, "key %s, ", lua_typename(l, lua_type(l, -2)) );
fprintf(stdout, "value %s\n", lua_typename(l, lua_type(l, -1)) );
lua_pop(l, 1);
}
return ( 0 );
}
Понятное дело, на выходе будет следующее...
Код:
key number, value table
key number, value table
key number, value table
key number, value table
key number, value table
key number, value table
key number, value table
Ещё момент... В плюсовом коде я закомментил lua_getglobal(l, "my_table"); и всё работает и без этого. Верно ли я понимаю ситуацию: указатель стека сейчас итак на таблице, т.к. я передаю её в lua-функции: Test2( my_table )
Так вот.. на выходе value - table... что с этим делать не пойму... если бы было, к примеру, number, то тут всё ясно:
1) проверяем, что это вообще number функцией lua_isnumber (lua_State *L1)
2) luaL_checkstring - достаём из lua_State *L1
3) передаём это дело в lua_State *L2 lua_pushnumber(...), lua_setglobal(...)
Помогите разобраться с проблемой и референсами плиз. Находил примеры, но не понял как это всё шаманство работает...
Вопрос наверняка где то замылен, так что не пинайте сильно :). Думаю, мне будет полезно создать такую тему, выложить в итоге небольшой работающий примерчик...
тут вот такой код, который здорово мне помог разобраться со стеком:
Позже накатаю пример как выдерать таблицы из одной vm и переносить их в другую
Нашёл
Код:
void stack_dump(lua_State *stack)
{
int stackSize = lua_gettop(stack);
std::cout << "Stack Dump: " << std::endl;
for (int i = stackSize; i > 0; --i)
{
int absoluteIndex = i;
int relativeIndex = stackSize - i + 1;
std::cout << "Index[" << absoluteIndex << " / -" << relativeIndex << "] = ";
int type = lua_type(stack, i);
switch (type)
{
case LUA_TSTRING:
std::cout << lua_tostring(stack, i);
break;
case LUA_TBOOLEAN:
std::cout << lua_toboolean(stack, i);
break;
case LUA_TNUMBER:
std::cout << lua_tonumber(stack, i);
break;
case LUA_TUSERDATA:
case LUA_TLIGHTUSERDATA:
std::cout << lua_touserdata(stack, i);
break;
default:
std::cout << lua_typename(stack, type);
}
std::cout << std::endl;
}
std::cout << std::endl;
}
{
int stackSize = lua_gettop(stack);
std::cout << "Stack Dump: " << std::endl;
for (int i = stackSize; i > 0; --i)
{
int absoluteIndex = i;
int relativeIndex = stackSize - i + 1;
std::cout << "Index[" << absoluteIndex << " / -" << relativeIndex << "] = ";
int type = lua_type(stack, i);
switch (type)
{
case LUA_TSTRING:
std::cout << lua_tostring(stack, i);
break;
case LUA_TBOOLEAN:
std::cout << lua_toboolean(stack, i);
break;
case LUA_TNUMBER:
std::cout << lua_tonumber(stack, i);
break;
case LUA_TUSERDATA:
case LUA_TLIGHTUSERDATA:
std::cout << lua_touserdata(stack, i);
break;
default:
std::cout << lua_typename(stack, type);
}
std::cout << std::endl;
}
std::cout << std::endl;
}
Позже накатаю пример как выдерать таблицы из одной vm и переносить их в другую