Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Lua & C++ как правильнее перенести таблицу из одной lua-vm в другую

69K
29 мая 2011 года
byers
4 / / 12.05.2011
Доброго времени суток, уважаемые =) !
Возникла необходимость перенести таблицу из одной VM lua в другую полностью. Вопрос на миллион: как это правильнее сделать??
Как создавать таблицы в С-функциях я разобрался быстро. Не пойму как выдёргивать их из стека...
т.е. вот, к примеру, есть такой Lua-шный код:
 
Код:
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 )


есть пример Си-шного кода, как выдёргивать имена типов в стеке

Код:
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 );
}


Понятное дело, на выходе будет следующее...

 
Код:
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(...)

Помогите разобраться с проблемой и референсами плиз. Находил примеры, но не понял как это всё шаманство работает...

Вопрос наверняка где то замылен, так что не пинайте сильно :). Думаю, мне будет полезно создать такую тему, выложить в итоге небольшой работающий примерчик...
69K
29 мая 2011 года
byers
4 / / 12.05.2011
Нашёл тут вот такой код, который здорово мне помог разобраться со стеком:

Код:
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;
}


Позже накатаю пример как выдерать таблицы из одной vm и переносить их в другую
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог