1 (2024-11-07 01:14:01 отредактировано Yuriy)

Тема: Обмен данными между стеками разных 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;
}

Прошу помощи!
Если можно объяснить подробно (для "особо одарённых").
Заранее благодарю!