<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; Передать таблицу из Lua в С++]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=398&amp;type=atom" />
	<updated>2022-10-04T17:14:34Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=398</id>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3737#p3737" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>И нифига это не работает,</p></blockquote></div><p>Отлично работает.<br />Удивился что никак не получается, потратил время, собрал все это у себя.</p><p>С++ код в dll у меня такой:</p><div class="codebox"><pre><code>static int forLua_TestDataSource(lua_State *L) {
    lua_getfield(L, -1, &quot;Size&quot;);
    lua_pushvalue(L, -2); 
    if (lua_pcall(L, 1, 1, 0) == 0)
        lua_pushinteger(L, lua_tointeger(L, -1));
    else
        lua_pushstring(L, &quot;ERROR pcall&quot;);

    return 1;
}</code></pre></div><p>Вызывающий Lua-код:</p><div class="codebox"><pre><code>dll = require(&quot;luacdll&quot;)

function main()
    local my_table_, err = CreateDataSource(&quot;TQBR&quot;, &quot;MSNG&quot;, INTERVAL_M1)
    message(&quot;Res=&quot; .. tostring(dll.TestDataSource(my_table_)))
end</code></pre></div><p>Выводит:</p><p><strong>Res=1</strong></p><p>Да, у меня как раз одна свеча по указанному инструменту.<br />Если указать несуществующий инструмент - выводит Res=0</p><p>Так что всё работает. И вроде от приведенного вами кода в сообщении #21 не отличается. Ищите ошибку в сборке.</p><p>Как вариант - вы запускаете Lua-скрипт в квике не на той версии Lua, с какой собираете свою библиотеку. Или еще что-то не так, не знаю.</p></blockquote></div><p>Вот мой результат на Ваш код:</p><p><span class="postimg"><img src="https://dropmefiles.com/ttbsX" alt="https://dropmefiles.com/ttbsX" /></span></p><br /><p>Я же говорю - это криворкуие разрабы квика, у которых руки из одного места растут.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-04T17:14:34Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3737#p3737</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3730#p3730" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>Как из этого кода Вы поняли что у Вас работает ??? Я не вижу вывода на консоль</p></blockquote></div><p>Посмотрите мой Lua-код.<br />Я в Message() вывожу то, что мне вернула DLL-библиотека.</p><div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>Подскажите пожалуйста версию quik и версию Lua - на который Вы это запустили ?</p></blockquote></div><p>QUIK 8.8.4 под рукой оказался. Там Lua5.3</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-04T16:50:50Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3730#p3730</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3729#p3729" />
			<content type="html"><![CDATA[<div class="codebox"><pre><code>static int forLua_TestDataSource(lua_State *L) {
    lua_getfield(L, -1, &quot;Size&quot;);
    lua_pushvalue(L, -2); 
    if (lua_pcall(L, 1, 1, 0) == 0)
        lua_pushinteger(L, lua_tointeger(L, -1));
    else
        lua_pushstring(L, &quot;ERROR pcall&quot;);

    return 1;
}</code></pre></div><p>Как из этого кода Вы поняли что у Вас работает ??? Я не вижу вывода на консоль размера табилцы.<br />Выведите именно на консоль, именно в С++ через std::cout.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-04T16:45:04Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3729#p3729</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3728#p3728" />
			<content type="html"><![CDATA[<p>Подскажите пожалуйста версию quik и версию Lua - на который Вы это запустили ?</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-04T16:40:50Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3728#p3728</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3727#p3727" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Так что всё работает. И вроде от приведенного вами кода в сообщении #21 не отличается. Ищите ошибку в сборке.</p><p>Как вариант - вы запускаете Lua-скрипт в квике не на той версии Lua, с какой собираете свою библиотеку. Или еще что-то не так, не знаю.</p></blockquote></div><p>Если бы была проблема в либах Lua - то тогда бы вообще ничего не работало. Но я без проблем предаю оыбчные чилсовые занчения, строки т даже одномерную простуюб таблицу из Lua в С++ - и все прекрасно работает. </p><p>А вот с таблицей от CreateDataSource - НЕ РАБОТАЕТ!</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-04T16:39:47Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3727#p3727</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3726#p3726" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>И нифига это не работает,</p></blockquote></div><p>Отлично работает.<br />Удивился что никак не получается, потратил время, собрал все это у себя.</p><p>С++ код в dll у меня такой:</p><div class="codebox"><pre><code>static int forLua_TestDataSource(lua_State *L) {
    lua_getfield(L, -1, &quot;Size&quot;);
    lua_pushvalue(L, -2); 
    if (lua_pcall(L, 1, 1, 0) == 0)
        lua_pushinteger(L, lua_tointeger(L, -1));
    else
        lua_pushstring(L, &quot;ERROR pcall&quot;);

    return 1;
}</code></pre></div><p>Вызывающий Lua-код:</p><div class="codebox"><pre><code>dll = require(&quot;luacdll&quot;)

function main()
    local my_table_, err = CreateDataSource(&quot;TQBR&quot;, &quot;MSNG&quot;, INTERVAL_M1)
    message(&quot;Res=&quot; .. tostring(dll.TestDataSource(my_table_)))
end</code></pre></div><p>Выводит:</p><p><strong>Res=1</strong></p><p>Да, у меня как раз одна свеча по указанному инструменту.<br />Если указать несуществующий инструмент - выводит Res=0</p><p>Так что всё работает. И вроде от приведенного вами кода в сообщении #21 не отличается. Ищите ошибку в сборке.</p><p>Как вариант - вы запускаете Lua-скрипт в квике не на той версии Lua, с какой собираете свою библиотеку. Или еще что-то не так, не знаю.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-04T16:37:19Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3726#p3726</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3724#p3724" />
			<content type="html"><![CDATA[<p>Делаю так:</p><div class="codebox"><pre><code>lua_getfield(L, -1, &quot;Size&quot;);  //Извлекаю ключ Size из таблицы и помещаю на вершину стека

//Проверяю, что на вершине стека:

    int status_lua_isC_function = lua_iscfunction(L, -1);
    std::cout &lt;&lt; &quot;status_lua_isC_function:&quot; &lt;&lt; status_lua_isC_function &lt;&lt; std::endl;  //return 1


    int status_lua_is_function = lua_isfunction(L, -1);
    std::cout &lt;&lt; &quot;status_lua_is_function:&quot; &lt;&lt; status_lua_is_function &lt;&lt; std::endl;     //return 1

//return 1 - означает на вершине стека - функция - видимо извлеченная функция Size.

    lua_pushvalue(L, -2); // Создаю копию таблицы и помещаю ее на вершину стека после функции Size.

    int status_lua_pcall = lua_pcall(L, 1, 1, 0); // Вызываю функцию Size с аргументом в виде таблицы и одним возвращаемым значением

    if (status_lua_pcall == LUA_ERRERR)
    {
        std::cout &lt;&lt; &quot;LUA_ERRERR&quot; &lt;&lt; std::endl;
    }</code></pre></div><br /><p>И нифига это не работает, так как lua_pcall - всегда завершается ошибкой LUA_ERRERR - ошибка во время выполнения обработчика ошибок.</p><p>Будьте прокляты создатели Lua.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-04T15:00:10Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3724#p3724</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3722#p3722" />
			<content type="html"><![CDATA[<p>Кромешный ад:</p><div class="codebox"><pre><code>lua_pushstring(L, &quot;Size&quot;);       //Помещаю на вершину стека название функции &quot;Size&quot;

int status_lua_pcall = lua_pcall(L, 1, 1, 0);    //Вызываю lua_pcall, которая принимает кол-во переданных аргументов - в моем случае это аргумент Size()  - то есть 1, и кол-во результата, которая должна возвратить функция - то есть размер таблицы - то же 1.

    if (status_lua_pcall != 0)
    {
        std::cout &lt;&lt; &quot;Error_lua_pcall:&quot; &lt;&lt; lua_tostring(L, -1) &lt;&lt; std::endl;
    }
    else
    {
        std::cout &lt;&lt; &quot;lua_pcall_result:&quot; &lt;&lt; lua_tonumber(L, -1) &lt;&lt; std::endl;
    }</code></pre></div><br /><p>lua_pcal завершается ошибкой - &quot;error in error handling&quot;.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-04T09:11:16Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3722#p3722</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3720#p3720" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>Если я правильно понимаю, в данном случае функция lua_pcall - не уместна. В этом случае же не нужно вызывать никаких функций.</p></blockquote></div><p>Но ведь в Lua вы не просто читаете поле<br /></p><div class="codebox"><pre><code>my_table_.Size</code></pre></div><p>вы же вызываете &quot;метод&quot;, причем через двоеточие<br /></p><div class="codebox"><pre><code>my_table_:Size()</code></pre></div><p>Вот примерно похожий вопрос:<br />[url]https://stackoverflow.com/questions/40551641/call-lua-table-function-from-c-w-self-in-function[/url]</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-04T07:26:20Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3720#p3720</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3719#p3719" />
			<content type="html"><![CDATA[<p>Раз Lua-код работает - значит все в QUIK правильно.<br />Надо просто разобраться с Lua-API</p><p>Size - это не просто поле таблицы, это (функция) (возможно, метод метатаблицы).<br />У меня сейчас нет времени подробно у себя все это воспроизводить и готового кода про это нет, поэтому точно подсказать не могу.</p><p>Выше я дал ссылку на документацию Lua, по этой ссылке есть код отличного дампера стека, что в нем лежит. Я думаю этот код поможет разобраться, информации тогда будет явно больше чем от lua_gettop()</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-04T07:22:41Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3719#p3719</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3718#p3718" />
			<content type="html"><![CDATA[<p>Делаю так:</p><p> </p><div class="codebox"><pre><code>    int size_stack = lua_gettop(L);
    std::cout &lt;&lt; size_stack &lt;&lt; std::endl;         //Размер стека 1

    lua_pushstring(L, &quot;Size&quot;);

    size_stack = lua_gettop(L);
    std::cout &lt;&lt; size_stack &lt;&lt; std::endl;         //Размер стека 2

    lua_gettable(L, -2);                          //lua_gettable - помешает на вершину стека значение Таблицы, которая расположена первый элементом в стеке по ключу расположенному на вершине стека, то есть по ключу &quot;Size&quot;

    size_stack = lua_gettop(L);
    std::cout &lt;&lt; size_stack &lt;&lt; std::endl;        //Размер стека 2, то есть  lua_gettable - доабвила значение по ключу Size за место доавленной выше строки &quot;Size&quot;

    std::cout &lt;&lt; &quot;Size_number:&quot; &lt;&lt; lua_tonumber(L, -1) &lt;&lt; std::endl;      //Извлекаю значение с вершин стека, НО оно равно НУЛЮ!!! ХОТЯ таблица переданная из Lua в Си - гарантировано имеет размер</code></pre></div><p>Есть у меня подозрение, что в Квике, как всегда какой то косяк и просто тупо что то не работает.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-04T07:14:42Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3718#p3718</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3717#p3717" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Хотя да. У нас же вот такой вызов<br /></p><div class="codebox"><pre><code>my_table_:Size()</code></pre></div><p>а не вот такой<br /></p><div class="codebox"><pre><code>my_table_.Size()</code></pre></div><p>Попробуйте тогда еще вот такой вариант:<br /></p><div class="codebox"><pre><code>static int forLua_get_historical_candles(lua_State* L)
{
   lua_pushstring(L, &quot;Size&quot;);
   lua_gettable(L, -2);
   lua_pushvalue(L, -2); 
   if (lua_pcall(L, 1, 1, 0) == 0)
        std::cout &lt;&lt; lua_tonumber(L, -1) &lt;&lt; std::endl;}</code></pre></div><p>PS<br />Вот очень наглядно показаны функции управления стеком Lua<br />[url]https://www.lua.org/pil/24.2.3.html[/url]</p></blockquote></div><p>Если я правильно понимаю, в данном случае функция lua_pcall - не уместна. В этом случае же не нужно вызывать никаких функций.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-04T06:49:29Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3717#p3717</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3716#p3716" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>А зачем вы все это мучаетесь делаете на Си ?<br />Сделайте пока код на Lua. Как минимум&nbsp; для отработки стратегии. Это ж много проще.<br />А уж если увидите узкие места в производительности - их можно будет на Си переписать.</p></blockquote></div><p>Код на Lua я уже сделал, но мне нужно в Си в своем приложении.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-04T06:01:29Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3716#p3716</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3715#p3715" />
			<content type="html"><![CDATA[<p>А зачем вы все это мучаетесь делаете на Си ?<br />Сделайте пока код на Lua. Как минимум&nbsp; для отработки стратегии. Это ж много проще.<br />А уж если увидите узкие места в производительности - их можно будет на Си переписать.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-04T02:19:38Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3715#p3715</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать таблицу из Lua в С++]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3714#p3714" />
			<content type="html"><![CDATA[<p>Хотя да. У нас же вот такой вызов<br /></p><div class="codebox"><pre><code>my_table_:Size()</code></pre></div><p>а не вот такой<br /></p><div class="codebox"><pre><code>my_table_.Size()</code></pre></div><p>Попробуйте тогда еще вот такой вариант:<br /></p><div class="codebox"><pre><code>static int forLua_get_historical_candles(lua_State* L)
{
   lua_pushstring(L, &quot;Size&quot;);
   lua_gettable(L, -2);
   lua_pushvalue(L, -2); 
   if (lua_pcall(L, 1, 1, 0) == 0)
        std::cout &lt;&lt; lua_tonumber(L, -1) &lt;&lt; std::endl;}</code></pre></div><p>PS<br />Вот очень наглядно показаны функции управления стеком Lua<br />[url]https://www.lua.org/pil/24.2.3.html[/url]</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-04T02:18:32Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3714#p3714</id>
		</entry>
</feed>
