<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; Обмен данными между стеками разных LuaState.]]></title>
		<link>https://quik2dde.ru/viewtopic.php?id=454</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;tid=454&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Обмен данными между стеками разных LuaState.».]]></description>
		<lastBuildDate>Sat, 02 Nov 2024 09:00:12 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Обмен данными между стеками разных LuaState.]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=4361#p4361</link>
			<description><![CDATA[<p>Никак не могу понять, почем не присвоить ключ и значение, переданных из другого стека, таблице в стеке другого состояния.<br />В L2 находится всё, что надо, но код не идёт. </p><div class="codebox"><pre><code>#include &lt;windows.h&gt;
#include &lt;string&gt;

#include &lt;lua.hpp&gt;


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
    return TRUE;
}

std::string CheckStack(lua_State* L, std::string message = &quot;&quot;) {
    std::string str = &quot;&quot;;
    int top = lua_gettop(L);

    for (int i = -1; i &gt;= 0 - top; i--) {
        std::string type_name = luaL_typename(L, i);
        std::string s = &quot;&quot;, ls = &quot;&quot;, t = &quot;&quot;;

        switch (lua_type(L, i)) {
        case LUA_TNONE: t = &quot;LUA_TNONE&quot;; break;
        case LUA_TNIL: t = &quot;LUA_TNIL &quot;; break;
        case LUA_TBOOLEAN:
            s = lua_toboolean(L, i) ? &quot;true&quot; : &quot;false&quot;;
            t = &quot;LUA_TBOOLEAN &quot;;
            break;
        case LUA_TLIGHTUSERDATA: t = &quot;LUA_TLIGHTUSERDATA &quot;; break;
        case LUA_TNUMBER:
            s = std::to_string(lua_tonumber(L, i));
            t = &quot;LUA_TNUMBER &quot;;
            break;
        case LUA_TSTRING:
            ls = lua_tostring(L, i);
            s = &quot;\&quot;&quot; + ls + &quot;\&quot;&quot;;
            t = &quot;LUA_TSTRING &quot;;
            break;
        case LUA_TTABLE: t = &quot;LUA_TTABLE &quot;; break;
        case LUA_TFUNCTION: t = &quot;LUA_TFUNCTION &quot;; break;
        case LUA_TUSERDATA: t = &quot;LUA_TUSERDATA &quot;; break;
        case LUA_TTHREAD: t = &quot;LUA_TTHREAD &quot;; break;
        }

        str += &quot;|&quot; + std::to_string(i) + &quot;; &quot; + std::to_string(top + i + 1) + &quot;| &quot;
            + t + type_name + &quot; &quot; + s + &quot;\n&quot;;
    }

#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, &quot;QW&quot;);
        CheckStack(L1, &quot;1 L1&quot;);
    lua_pushnumber(L1, 11);
        CheckStack(L1, &quot;2 L1&quot;);
    lua_settable(L1, -3);
        CheckStack(L1, &quot;3 L1&quot;);
    // возвращаем из таблицы значение:
    lua_pushstring(L1, &quot;QW&quot;);
        CheckStack(L1, &quot;4 L1&quot;);
    lua_gettable(L1, -2);
        CheckStack(L1, &quot;5 L1&quot;);
    // вводим ключ:
    lua_pushstring(L1, &quot;QW&quot;);
        CheckStack(L1, &quot;6 L1&quot;);
    // меняем ключ изначение местами:
    lua_insert(L1, -2);
        CheckStack(L1, &quot;7 L1&quot;);
    // переносим ключ и значение из L1 в L2:
    lua_xmove(L1, L2, 2);
        CheckStack(L1, &quot;8 L1&quot;);
        // на стеке L2 ключ и значение в нужном порядке!
        CheckStack(L2, &quot;1 L2&quot;);
    // вводим ключ и значение в таблицу в L2:
    lua_settable(L2, -3);
        CheckStack(L2, &quot;2 L2&quot;);
    // вводим ключ:
    lua_pushstring(L2, &quot;QW&quot;);
        CheckStack(L2, &quot;3 L2&quot;);
    // возвращаем значение:
    lua_gettable(L2, -2);
    // и - ничего не получили!
        CheckStack(L2, &quot;4 L2&quot;);

    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, &quot;QW&quot;);
    lua_pushnumber(L3, 11);
    lua_settable(L3, -3);
    // возвращаем из таблицы значение:
    lua_pushstring(L3, &quot;QW&quot;); 
        CheckStack(L3, &quot;1 L3&quot;);
    // возвращаем из таблицы значение:
    lua_gettable(L3, -2);
        CheckStack(L3, &quot;2 L3&quot;);

    // вводим ключ в L4:
    lua_pushstring(L4, &quot;QW&quot;);
        CheckStack(L4, &quot;1 L4&quot;);
    // переносим значение из L3 в L4:
    lua_xmove(L3, L4, 1);
        CheckStack(L4, &quot;2 L4&quot;);
    // заполняем таблицу:
    lua_settable(L4, -3);
        CheckStack(L4, &quot;3 L4&quot;);
    // вводим ключ:
    lua_pushstring(L4, &quot;QW&quot;);
        CheckStack(L4, &quot;4 L4&quot;);
    // возвращаем значение:
    lua_gettable(L4, -2);
    // всё в порядке!
        CheckStack(L4, &quot;5 L4&quot;);

    lua_close(L3);
    lua_close(L4);
}

int Start(lua_State* L) { F(); return 0; }

static struct luaL_Reg ls_lib[] = {{ &quot;Start&quot;, Start },{NULL, NULL}};

extern &quot;C&quot; __declspec(dllexport) int luaopen_LuaSt(lua_State* L) {
    luaL_newlib(L, ls_lib);
    return 1;
}</code></pre></div><p>Прошу помощи!<br />Если можно объяснить подробно (для &quot;особо одарённых&quot;). <br />Заранее благодарю!</p>]]></description>
			<author><![CDATA[null@example.com (Yuriy)]]></author>
			<pubDate>Sat, 02 Nov 2024 09:00:12 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=4361#p4361</guid>
		</item>
	</channel>
</rss>
