<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Форум QUIK [тема: Вызов lua_CFunction из С++]</title>
		<link>http://forum.quik.ru</link>
		<description>Новое в теме Вызов lua_CFunction из С++ форума  на сайте Форум QUIK [forum.quik.ru]</description>
		<language>ru</language>
		<docs>http://backend.userland.com/rss2</docs>
		<pubDate>Sat, 23 May 2026 22:32:25 +0300</pubDate>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14563/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_5rApycXD" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a>, <br />Читайте внимательно документацию. У Вас сейчас есть всё для того (и книга и google), чтобы писать правильный код.<br />Также отладочной печатью в контрольных точках можно понять, после какой операции &quot;падает&quot; программа, а с помощью отладочной печати значений lua_gettop(L) - что происходит со стеком Lua во время выполнения.<br />Или наймите программиста / консультанта, который сделает это за Вас.<br /><br />Перечитайте ещё раз документацию к luaL_ref. <br />
			<i>25.03.2016 12:47:51, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14563/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14563/topic1598/</guid>
			<pubDate>Fri, 25 Mar 2016 12:47:51 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14537/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_KRNlZumr" href="/user/62/" bx-tooltip-user-id="62">Николай  Камынин</a> написал:<br />Стек в луа - это просто область памяти, указатель на которую находится по адресу L-&gt;base<br />При вталкивании в стек данные записываются по адресу, который записан в L-&gt;top <br />Сначала там записан L-&gt;base, после каждого заталкивания L-&gt;top=L-&gt;top+1<br />При выталкивание происходит обратное действие.<br />При этом происходит контроль границ стека и если адрес выходит за границы выдается сообщение луа.<br />-------------------------------<br />Таким образом, КВИК падать не может из-за операций со стеком.<br />----------------------------<br />Если у Вас квик падает без сообщений, то ошибка в Вашем коде CИ, которай приводит к фатальной ошибке, которую никто не обрабатывает. Возможно Вы в своей программе куда-то не туда чего-то пишите.<br />--------------------------------<br />Все колбеки выполняются в одном потоке.<br />Но вот открытие источников надо делать в main. Не знаю для чего так сделано, но уж сделано.<br />=============<br />Спасибо за разъяснения, проверю свой код. Да, ошибки не обрабатываю, нужно это добавить.<br />Источник открываю в main, пока всё работает. <br />
			<i>25.03.2016 09:20:06, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14537/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14537/topic1598/</guid>
			<pubDate>Fri, 25 Mar 2016 09:20:06 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14530/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_Y2DewzfE" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a> написал:<br /><br />====quote====<br /> Вячеслав + &nbsp; написал:<br />Если между вызовами Си функций из Lua, то можно сохранить это значение в LUA_REGISTRYINDEX - это специальная таблица, видимая только из Си и хранящая важную информацию (удалять из неё что-то не своё точно не надо). См. API<br />idx = luaL_ref(L, LUA_REGISTRYINDEX)<br />luaL_unref(L, LUA_REGISTRYINDEX, idx)<br />lua_rawgeti(L, LUA_REGISTRYINDEX, idx)<br /><br />=============<br />Спасибо, эти функции у меня в коде есть. Меня насторожило то, что если сохранить ссылку
====code====
<pre>&nbsp;&nbsp;idx&nbsp;&nbsp;=&nbsp;&nbsp;luaL_ref(L, LUA_REGISTRYINDEX) ,&nbsp;&nbsp;</pre>
=============
потом вытолкнуть её из стека 
====code====
<pre>&nbsp;&nbsp;lua_pop(L,&nbsp;&nbsp;1 ),&nbsp;&nbsp; </pre>
=============
затем попытаться вернуть
====code====
<pre>&nbsp;&nbsp;lua_rawgeti(L, LUA_REGISTRYINDEX, idx) ,&nbsp;&nbsp;</pre>
=============
то Quik падает при выполнении таких операций.<br /><br />Видимо, при удалении единственной ссылки на таблицу, Lua удаляет её содержимое.<br /><br />Видимо, выходом в такой ситуации будет, как Вы писали:<br />
====code====
<pre>&nbsp;&nbsp;lua_setglobal(L,&nbsp;&nbsp;"myDS" );&nbsp;&nbsp;</pre>
=============
Правда, в этом случае, придётся склеивать индивидуальное символьное имя для каждого источника данных.<br /><br />Про разные потоки callback'ов и main'a знаю, но про синхронизацию доступа пока не думал. Нужно будет это учесть.<br /><br />А все callback'и выполняются в одном потоке?<br />=============<br />Стек в луа - это просто область памяти, указатель на которую находится по адресу L-&gt;base<br />При вталкивании в стек данные записываются по адресу, который записан в L-&gt;top <br />Сначала там записан L-&gt;base, после каждого заталкивания L-&gt;top=L-&gt;top+1<br />При выталкивание происходит обратное действие.<br />При этом происходит контроль границ стека и если адрес выходит за границы выдается сообщение луа.<br />-------------------------------<br />Таким образом, КВИК падать не может из-за операций со стеком.<br />----------------------------<br />Если у Вас квик падает без сообщений, то ошибка в Вашем коде CИ, которай приводит к фатальной ошибке, которую никто не обрабатывает. Возможно Вы в своей программе куда-то не туда чего-то пишите.<br />--------------------------------<br />Все колбеки выполняются в одном потоке.<br />Но вот открытие источников надо делать в main. Не знаю для чего так сделано, но уж сделано. <br />
			<i>25.03.2016 07:37:13, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14530/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14530/topic1598/</guid>
			<pubDate>Fri, 25 Mar 2016 07:37:13 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14529/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_5O83IhHa" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав +</a> написал:<br />Если между вызовами Си функций из Lua, то можно сохранить это значение в LUA_REGISTRYINDEX - это специальная таблица, видимая только из Си и хранящая важную информацию (удалять из неё что-то не своё точно не надо). См. API<br />idx = luaL_ref(L, LUA_REGISTRYINDEX)<br />luaL_unref(L, LUA_REGISTRYINDEX, idx)<br />lua_rawgeti(L, LUA_REGISTRYINDEX, idx)<br /><br />=============<br />Спасибо, эти функции у меня в коде есть. Меня насторожило то, что если сохранить ссылку
====code====
<pre>idx = luaL_ref(L, LUA_REGISTRYINDEX) ,</pre>
=============
потом вытолкнуть её из стека 
====code====
<pre>lua_pop(L, 1), </pre>
=============
затем попытаться вернуть
====code====
<pre>lua_rawgeti(L, LUA_REGISTRYINDEX, idx) ,</pre>
=============
то Quik падает при выполнении таких операций.<br /><br />Видимо, при удалении единственной ссылки на таблицу, Lua удаляет её содержимое.<br /><br />Видимо, выходом в такой ситуации будет, как Вы писали:<br />
====code====
<pre>lua_setglobal(L, "myDS");</pre>
=============
Правда, в этом случае, придётся склеивать индивидуальное символьное имя для каждого источника данных.<br /><br />Про разные потоки callback'ов и main'a знаю, но про синхронизацию доступа пока не думал. Нужно будет это учесть.<br /><br />А все callback'и выполняются в одном потоке? <br />
			<i>25.03.2016 06:51:19, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14529/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14529/topic1598/</guid>
			<pubDate>Fri, 25 Mar 2016 06:51:19 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14521/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_mE1gQJMU" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a> написал:<br />Как же сохранить ссылку на таблицу, чтобы она &quot;не потерялась&quot; до конца работы программы?<br />=============<br />Также можно хранить ссылку в глобальной переменной Lua - см. lua_setglobal(L, &quot;myDS&quot;); <br />
			<i>24.03.2016 22:02:40, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14521/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14521/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 22:02:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14520/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Кстати, учтите, если Вы будете вызывать Ваши Си функции из разных потоков - поток main и поток callback'ов - то Вам нужно будет обеспечивать синхронный доступ к Вашим глобальным переменным. Можно с помощью std::mutex / std::recursive_mutex. <br />
			<i>24.03.2016 22:00:50, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14520/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14520/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 22:00:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14519/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			А idx уже можно хранить в глобальной переменной в DLL, т. к. это int. <br />
			<i>24.03.2016 21:58:44, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14519/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14519/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 21:58:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14518/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_nuSshznq" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a> написал:<br />Получается, нужно знать индекс элемента, который требуется положить в стек. Как же сохранить ссылку на таблицу, чтобы она &quot;не потерялась&quot; до конца работы программы? Или не перепуталась со ссылкой на другой источник данных.<br /><br />=============<br />Если между вызовами Си функций из Lua, то можно сохранить это значение в LUA_REGISTRYINDEX - это специальная таблица, видимая только из Си и хранящая важную информацию (удалять из неё что-то не своё точно не надо). См. API<br /><ul><li>idx = luaL_ref(L, LUA_REGISTRYINDEX)<br /><li>luaL_unref(L, LUA_REGISTRYINDEX, idx)<br /><li>lua_rawgeti(L, LUA_REGISTRYINDEX, idx)<br /></ul><br />====quote====<br /><a class="blog-p-user-name" id="bp_rm6A6B8f" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a> написал:<br />говорит &quot;table&quot;<br />=============<br />Значит таблица. <br />
			<i>24.03.2016 21:57:12, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14518/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14518/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 21:57:12 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14517/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_01TN4Q1q" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав +</a> написал:<br />Рекомендую к прочтению книгу &quot;Roberto Ierusalimschy - Programming in Lua - 2013&quot;. В своё время потратил на неё неделю, и не жалею.<br /><br />=============<br />Спасибо за Ваш совет, книга лежит, ждёт прочтения.<br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_iGAlYg74" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав +</a> написал:<br />lua_pushvalue как раз копирует значение<br />=============<br />Нашёл описание:<br />void lua_pushvalue (lua_State *L, int index);<br />Pushes a copy of the element at the given valid index onto the stack.<br /><br />Получается, нужно знать индекс элемента, который требуется положить в стек. Как же сохранить ссылку на таблицу, чтобы она &quot;не потерялась&quot; до конца работы программы? Или не перепуталась со ссылкой на другой источник данных.<br />
====code====
<pre>message(type(DS),1);</pre>
=============
говорит &quot;table&quot; <br />
			<i>24.03.2016 21:51:42, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14517/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14517/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 21:51:42 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14516/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_iMO0K1K1" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a> написал:<br />Видимо, я не до конца понимаю организацию стека Lua. <br />=============<br />Рекомендую к прочтению книгу &quot;Roberto Ierusalimschy - Programming in Lua - 2013&quot;. В своё время потратил на неё неделю, и не жалею.<br /><br /><br />====quote====<br /><a class="blog-p-user-name" id="bp_1MQC7QMZ" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a> написал:<br />Правильно ли я понял, что таблица DS существует, пока указатель на неё хранится в стеке?<br />=============<br /><br />Немного подкорректирую Ваш вопрос:<br /><br />====quote====<br />Правильно ли я понял, что <B>значение </B>DS существует, пока <B>оно </B>хранится в стеке?<br />=============<br />Да. Это правильно.<br /><br />Само значение, кроме того, можно скопировать (например, в качестве значения одного из ключей другой таблицы; lua_pushvalue как раз копирует значение). Таблицы на стеке хранятся в виде ссылок на содержимое таблиц, т.е. при таком копировании сами элементы таблицы не копируются - копируется только ссылка на таблицу.<br /><br />За освобождение памяти выделенной под Lua-таблицы, userdata и строки отвечает сборщик мусора.<br />Освобожение памяти обычно происходит позже удаления всех ссылкок на таблицу / userdata / string.<br /><br />Кстати, а Вы уверены, что DS - это таблица? Что говорит
====code====
<pre>message(type(DS),1);</pre>
=============
?<br /><br />Если DS - это таблица, то QLUA API в этом месте сделано немного кривовато, т. к. DS можно бы было сразу сделать userdata, чтобы Си код обработки методов DS выглядел лаконичней и чуть производительней. <br />
			<i>24.03.2016 21:35:50, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14516/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14516/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 21:35:50 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14515/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_BBwrhos6" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав +</a> написал:<br /> dj.lexus &nbsp;, 
====code====
<pre>&nbsp;&nbsp;int myfunction(lua_State *&nbsp;&nbsp;L) {
&nbsp;&nbsp; // DS&nbsp;&nbsp;=&nbsp;&nbsp; CreateDataSource ( "SPBFUT" ,&nbsp;&nbsp;"RIM6" , INTERVAL_M1); // Работает

&nbsp;&nbsp; lua_getglobal(L,&nbsp;&nbsp;"CreateDataSource" );
&nbsp;&nbsp; lua_pushstring(L,&nbsp;&nbsp;"SPBFUT" );
&nbsp;&nbsp; lua_pushstring(L,&nbsp;&nbsp;"RIM6" );
&nbsp;&nbsp; lua_getglobal(L,&nbsp;&nbsp;"INTERVAL_M1" );
&nbsp;&nbsp; lua_call(L,&nbsp;&nbsp;3 ,&nbsp;&nbsp;1 );

&nbsp;&nbsp; // результат на стеке
&nbsp;&nbsp; int DS&nbsp;&nbsp;=&nbsp;&nbsp;lua_gettop(L);

&nbsp;&nbsp; // C&nbsp;&nbsp;=&nbsp;&nbsp;DS:C( 1 ); // Не получается
&nbsp;&nbsp; lua_getfield(L, DS,&nbsp;&nbsp;"C" );
&nbsp;&nbsp; lua_pushvalue(L, DS);
&nbsp;&nbsp; lua_pushnumber(L,&nbsp;&nbsp;1 );
&nbsp;&nbsp; lua_call(L,&nbsp;&nbsp;2 ,&nbsp;&nbsp;1 );

&nbsp;&nbsp; // результат на стеке
&nbsp;&nbsp; int C&nbsp;&nbsp;=&nbsp;&nbsp;lua_gettop(L);

&nbsp;&nbsp; // DS: Close (); // Не получается
&nbsp;&nbsp; lua_getfield(L, DS,&nbsp;&nbsp;"Close" );
&nbsp;&nbsp; lua_pushvalue(L, DS);
&nbsp;&nbsp; lua_call(L,&nbsp;&nbsp;1 ,&nbsp;&nbsp;0 );

&nbsp;&nbsp; // В Lua 
&nbsp;&nbsp; // obj:func(param);
&nbsp;&nbsp; // это то же самое что
&nbsp;&nbsp; //&nbsp;&nbsp;obj.func (obj, param);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// как - то так
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&nbsp; 0 ;
}
&nbsp;&nbsp;</pre>
=============
<br />=============<br />Спасибо, заработало!<br />Видимо, я не до конца понимаю организацию стека Lua. <br />Правильно ли я понял, что таблица DS существует, пока указатель на неё хранится в стеке? <br />
			<i>24.03.2016 20:42:40, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14515/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14515/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 20:42:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14513/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<ul><li>Перед &quot;return 0;&quot; на стеке останутся лежать DS и С ( который = DS:C(1) ).<br /><li>Можно стек не чистить, если myfunction вызывалась из Lua-кода.<br /><li>Если планируете на стеке хранить много аргументов ( &gt; LUA_MINSTACK), то гляньте документацию к lua_checkstack.<br /></ul> <br />
			<i>24.03.2016 20:03:40, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14513/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14513/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 20:03:40 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14511/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<a class="blog-p-user-name" id="bp_TXGHSMeQ" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a>, 
====code====
<pre>int myfunction(lua_State* L) {
&nbsp;&nbsp;&nbsp;// DS = CreateDataSource("SPBFUT", "RIM6", INTERVAL_M1); // Работает

&nbsp;&nbsp;&nbsp;lua_getglobal(L, "CreateDataSource");
&nbsp;&nbsp;&nbsp;lua_pushstring(L, "SPBFUT");
&nbsp;&nbsp;&nbsp;lua_pushstring(L, "RIM6");
&nbsp;&nbsp;&nbsp;lua_getglobal(L, "INTERVAL_M1");
&nbsp;&nbsp;&nbsp;lua_call(L, 3, 1);

&nbsp;&nbsp;&nbsp;// результат на стеке
&nbsp;&nbsp;&nbsp;int DS = lua_gettop(L);

&nbsp;&nbsp;&nbsp;// C = DS:C(1); // Не получается
&nbsp;&nbsp;&nbsp;lua_getfield(L, DS, "C");
&nbsp;&nbsp;&nbsp;lua_pushvalue(L, DS);
&nbsp;&nbsp;&nbsp;lua_pushnumber(L, 1);
&nbsp;&nbsp;&nbsp;lua_call(L, 2, 1);

&nbsp;&nbsp;&nbsp;// результат на стеке
&nbsp;&nbsp;&nbsp;int C = lua_gettop(L);

&nbsp;&nbsp;&nbsp;// DS:Close(); // Не получается
&nbsp;&nbsp;&nbsp;lua_getfield(L, DS, "Close");
&nbsp;&nbsp;&nbsp;lua_pushvalue(L, DS);
&nbsp;&nbsp;&nbsp;lua_call(L, 1, 0);

&nbsp;&nbsp;&nbsp;// В Lua 
&nbsp;&nbsp;&nbsp;// obj:func(param);
&nbsp;&nbsp;&nbsp;// это то же самое что
&nbsp;&nbsp;&nbsp;// obj.func(obj, param);

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// как-то так
&nbsp;&nbsp;&nbsp;return 0;
}
</pre>
============= <br />
			<i>24.03.2016 19:53:56, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14511/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14511/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 19:53:56 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14505/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_mxg88VxE" href="/user/1604/" bx-tooltip-user-id="1604">Вячеслав +</a> написал:<br />Напишите, что Вы хотите выполнить на Lua - помогу перевести на С++.<br />=============<br />Я пытаюсь сделать следующее:<br />
====code====
<pre>DS = CreateDataSource("SPBFUT", "RIM6", INTERVAL_M1); // Работает

...

C = DS:C(1); // Не получается

...

DS:Close(); // Не получается
</pre>
=============
<br />Таблица DS содержит всё, как должно быть:<br />C - function<br />Close - function<br />_DataSource - userdata<br />T - function<br />V - function<br />SetUpdateCallback - function<br />H - function<br />SetEmptyCallback - function<br />L - function<br />O - function<br />Size - function <br />
			<i>24.03.2016 18:56:22, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14505/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14505/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 18:56:22 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14502/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_eawKd5cW" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a> написал:<br />Я пытаюсь запустить из С++ функцию, ссылку на которую возвращает другая функция.<br />
====code====
<pre>&nbsp;&nbsp;lua_CFunction&nbsp;&nbsp;Close Handle;

//Создаём источник данных

lua_getglobal(L,&nbsp;&nbsp;"CreateDataSource" );
lua_pushstring(L, class_code); //class_code
lua_pushstring(L, sec_code); //sec_code
lua_pushinteger(L, interval); //interval
lua_call(L,&nbsp;&nbsp;3 ,&nbsp;&nbsp;2 );

 if (lua_istable(L, 1 ))
{
&nbsp;&nbsp; lua_push nil (L);
&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;&nbsp;(lua_next(L,&nbsp;&nbsp;1 )&nbsp;&nbsp;!&nbsp;&nbsp;=&nbsp;&nbsp; 0 )
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strcmp(lua_tostring(L,&nbsp;&nbsp;-&nbsp;&nbsp;2 ),&nbsp;&nbsp;"Close" )&nbsp;&nbsp;=&nbsp;&nbsp;=&nbsp;&nbsp; 0 ) //Проверяем название поля
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Close Handle&nbsp;&nbsp;=&nbsp;&nbsp;lua_tocfunction(L,&nbsp;&nbsp;-&nbsp;&nbsp;1 );
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pop(L,&nbsp;&nbsp;1 );
&nbsp;&nbsp; }
}

bool err&nbsp;&nbsp;=&nbsp;&nbsp;lua_isstring(L, 2 );

//Закрываем источник данных

 if ( Close Handle)
{
&nbsp;&nbsp; lua_pushcfunction(L,&nbsp;&nbsp;Close Handle);
&nbsp;&nbsp; lua_call (L,&nbsp;&nbsp;0 ,&nbsp;&nbsp;1 );
&nbsp;&nbsp;&nbsp;&nbsp;if (lua_isboolean(L,&nbsp;&nbsp;1 ))
&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;&nbsp;=&nbsp;&nbsp;lua_toboolean(L,&nbsp;&nbsp;1 )
&nbsp;&nbsp; }
}
 return&nbsp;&nbsp;result;&nbsp;&nbsp;</pre>
=============
<br />Источник данных не закрывается. Может, кто сталкивался с подобной проблемой? В чём ошибка?<br />=============<br />Напишите, что Вы хотите выполнить на Lua - помогу перевести на С++. <br />
			<i>24.03.2016 16:47:11, Вячеслав +.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14502/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14502/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 16:47:11 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14498/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Я тоже передаю данные и туда и обратно, но это не мешает использовать и си функции и луа.<br />Из опыта могу сказать что на Си надо &nbsp;делать то, что нет в луа <br />например работу с различными форматами, потоками памятью. <br />
			<i>24.03.2016 16:30:18, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14498/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14498/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 16:30:18 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14493/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Да, я согласен, что во многих случаях можно обойтись возможностями LUA. Но, у меня задача - передавать данные в приложение на С. Поэтому, решено было оставить скрипт LUA пустым и все функции реализовать в DLL. <br />
			<i>24.03.2016 14:46:58, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14493/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14493/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 14:46:58 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14491/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			а еще лучше , не делать на Си то, что можно сделать на луа <br />
			<i>24.03.2016 14:37:31, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14491/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14491/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 14:37:31 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14490/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			а еще проще не вставлять &nbsp;в DLL, а поместить в скрипт и вызывать из dll <br />
			<i>24.03.2016 14:36:27, Николай  Камынин.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14490/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14490/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 14:36:27 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14489/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Спасибо! Оставлю этот вариант на случай, если не получится никак иначе.<br /><br />Вроде бы, простая задача: в стеке лежит указатель на таблицу. В таблице есть функция. Осталось её выполнить. <br />
			<i>24.03.2016 14:31:44, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14489/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14489/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 14:31:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14487/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			google: &nbsp; bin2c <br />
			<i>24.03.2016 14:04:16, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14487/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14487/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 14:04:16 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14486/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_P51bkfiR" href="/user/47/" bx-tooltip-user-id="47"><noindex><a href="mailto:s_mike@rambler.ru" target="_blank" rel="nofollow">s_mike@rambler.ru</a></noindex></a> написал:<br /><br />====quote====<br /> dj.lexus &nbsp; написал:<br />Собственно, почему не работает, стало немного понятно. Тут нужно работать со всей метатаблицей, т.к. её методы нуждаются в ссылке не конкретный экземпляр источника данных. Но, как это сделать, ещё не ясно. Можно ли функции &quot;Close&quot; как нибудь подсунуть &quot;_DataSource&quot; - &quot;userdata&quot; из таблицы?<br />=============<br />Может, не мучиться, а написать этот фрагмент на lua и всунуть его вовнутрь вашей длл?<br />=============<br />Да, это тоже выход. А как кусок LUA кода вставить в DLL? <br />
			<i>24.03.2016 13:52:17, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14486/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14486/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 13:52:17 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14482/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			<br />====quote====<br /><a class="blog-p-user-name" id="bp_SvL33h7V" href="/user/1788/" bx-tooltip-user-id="1788">dj.lexus</a> написал:<br />Собственно, почему не работает, стало немного понятно. Тут нужно работать со всей метатаблицей, т.к. её методы нуждаются в ссылке не конкретный экземпляр источника данных. Но, как это сделать, ещё не ясно. Можно ли функции &quot;Close&quot; как нибудь подсунуть &quot;_DataSource&quot; - &quot;userdata&quot; из таблицы?<br />=============<br />Может, не мучиться, а написать этот фрагмент на lua и всунуть его вовнутрь вашей длл? <br />
			<i>24.03.2016 13:02:07, s_mike@rambler.ru.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14482/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14482/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 13:02:07 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14475/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Собственно, почему не работает, стало немного понятно. Тут нужно работать со всей метатаблицей, т.к. её методы нуждаются в ссылке не конкретный экземпляр источника данных. Но, как это сделать, ещё не ясно. Можно ли функции &quot;Close&quot; как нибудь подсунуть &quot;_DataSource&quot; - &quot;userdata&quot; из таблицы? <br />
			<i>24.03.2016 11:38:44, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14475/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14475/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 11:38:44 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
		<item>
			<title>Вызов lua_CFunction из С++</title>
			<description><![CDATA[<b><a href="http://forum.quik.ru/messages/forum10/message14469/topic1598/">Вызов lua_CFunction из С++</a></b> в форуме <a href="http://forum.quik.ru/forum10/">Программирование на языке Lua</a>. <br />
			Я пытаюсь запустить из С++ функцию, ссылку на которую возвращает другая функция.<br />
====code====
<pre>lua_CFunction CloseHandle;

//Создаём источник данных

lua_getglobal(L, "CreateDataSource");
lua_pushstring(L, class_code); //class_code
lua_pushstring(L, sec_code); //sec_code
lua_pushinteger(L, interval); //interval
lua_call(L, 3, 2);

if(lua_istable(L,1))
{
&nbsp;&nbsp;&nbsp;lua_pushnil(L);
&nbsp;&nbsp;&nbsp;while (lua_next(L, 1) != 0)
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(strcmp(lua_tostring(L, -2), "Close") == 0) //Проверяем название поля
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CloseHandle = lua_tocfunction(L, -1);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lua_pop(L, 1);
&nbsp;&nbsp;&nbsp;}
}

bool err = lua_isstring(L,2);

//Закрываем источник данных

if(CloseHandle)
{
&nbsp;&nbsp;&nbsp;lua_pushcfunction(L, CloseHandle);
&nbsp;&nbsp;&nbsp;lua_call (L, 0, 1);
&nbsp;&nbsp;&nbsp;if(lua_isboolean(L, 1))
&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result = lua_toboolean(L, 1)
&nbsp;&nbsp;&nbsp;}
}
return result;</pre>
=============
<br />Источник данных не закрывается. Может, кто сталкивался с подобной проблемой? В чём ошибка? <br />
			<i>24.03.2016 08:47:36, dj.lexus.</i>]]></description>
			<link>http://forum.quik.ru/messages/forum10/message14469/topic1598/</link>
			<guid>http://forum.quik.ru/messages/forum10/message14469/topic1598/</guid>
			<pubDate>Thu, 24 Mar 2016 08:47:36 +0300</pubDate>
			<category>Программирование на языке Lua</category>
		</item>
	</channel>
</rss>
