Тема: Обмен данными между стеками разных LuaState.
Никак не могу понять, почем не присвоить ключ и значение, переданных из другого стека, таблице в стеке другого состояния.
В L2 находится всё, что надо, но код не идёт.
#include <windows.h>
#include <string>
#include <lua.hpp>
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
return TRUE;
}
std::string CheckStack(lua_State* L, std::string message = "") {
std::string str = "";
int top = lua_gettop(L);
for (int i = -1; i >= 0 - top; i--) {
std::string type_name = luaL_typename(L, i);
std::string s = "", ls = "", t = "";
switch (lua_type(L, i)) {
case LUA_TNONE: t = "LUA_TNONE"; break;
case LUA_TNIL: t = "LUA_TNIL "; break;
case LUA_TBOOLEAN:
s = lua_toboolean(L, i) ? "true" : "false";
t = "LUA_TBOOLEAN ";
break;
case LUA_TLIGHTUSERDATA: t = "LUA_TLIGHTUSERDATA "; break;
case LUA_TNUMBER:
s = std::to_string(lua_tonumber(L, i));
t = "LUA_TNUMBER ";
break;
case LUA_TSTRING:
ls = lua_tostring(L, i);
s = "\"" + ls + "\"";
t = "LUA_TSTRING ";
break;
case LUA_TTABLE: t = "LUA_TTABLE "; break;
case LUA_TFUNCTION: t = "LUA_TFUNCTION "; break;
case LUA_TUSERDATA: t = "LUA_TUSERDATA "; break;
case LUA_TTHREAD: t = "LUA_TTHREAD "; break;
}
str += "|" + std::to_string(i) + "; " + std::to_string(top + i + 1) + "| "
+ t + type_name + " " + s + "\n";
}
#ifdef UNICODE
MessageBoxW(NULL, str.c_str(), message.c_str(), MB_OK);
#else
MessageBoxA(NULL, str.c_str(), message.c_str(), MB_OK);
#endif
return str;
}
void F() {
lua_State* L1 = luaL_newstate();
lua_State* L2 = luaL_newstate();
lua_newtable(L1);
lua_newtable(L2);
// заполняем таблицу:
lua_pushstring(L1, "QW");
CheckStack(L1, "1 L1");
lua_pushnumber(L1, 11);
CheckStack(L1, "2 L1");
lua_settable(L1, -3);
CheckStack(L1, "3 L1");
// возвращаем из таблицы значение:
lua_pushstring(L1, "QW");
CheckStack(L1, "4 L1");
lua_gettable(L1, -2);
CheckStack(L1, "5 L1");
// вводим ключ:
lua_pushstring(L1, "QW");
CheckStack(L1, "6 L1");
// меняем ключ изначение местами:
lua_insert(L1, -2);
CheckStack(L1, "7 L1");
// переносим ключ и значение из L1 в L2:
lua_xmove(L1, L2, 2);
CheckStack(L1, "8 L1");
// на стеке L2 ключ и значение в нужном порядке!
CheckStack(L2, "1 L2");
// вводим ключ и значение в таблицу в L2:
lua_settable(L2, -3);
CheckStack(L2, "2 L2");
// вводим ключ:
lua_pushstring(L2, "QW");
CheckStack(L2, "3 L2");
// возвращаем значение:
lua_gettable(L2, -2);
// и - ничего не получили!
CheckStack(L2, "4 L2");
lua_close(L1);
lua_close(L2);
//==================================================
// А этод код работает!
lua_State* L3 = luaL_newstate();
lua_State* L4 = luaL_newstate();
lua_newtable(L3);
lua_newtable(L4);
// заполняем таблицу:
lua_pushstring(L3, "QW");
lua_pushnumber(L3, 11);
lua_settable(L3, -3);
// возвращаем из таблицы значение:
lua_pushstring(L3, "QW");
CheckStack(L3, "1 L3");
// возвращаем из таблицы значение:
lua_gettable(L3, -2);
CheckStack(L3, "2 L3");
// вводим ключ в L4:
lua_pushstring(L4, "QW");
CheckStack(L4, "1 L4");
// переносим значение из L3 в L4:
lua_xmove(L3, L4, 1);
CheckStack(L4, "2 L4");
// заполняем таблицу:
lua_settable(L4, -3);
CheckStack(L4, "3 L4");
// вводим ключ:
lua_pushstring(L4, "QW");
CheckStack(L4, "4 L4");
// возвращаем значение:
lua_gettable(L4, -2);
// всё в порядке!
CheckStack(L4, "5 L4");
lua_close(L3);
lua_close(L4);
}
int Start(lua_State* L) { F(); return 0; }
static struct luaL_Reg ls_lib[] = {{ "Start", Start },{NULL, NULL}};
extern "C" __declspec(dllexport) int luaopen_LuaSt(lua_State* L) {
luaL_newlib(L, ls_lib);
return 1;
}
Прошу помощи!
Если можно объяснить подробно (для "особо одарённых").
Заранее благодарю!