<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; Передать в SetUpdateCallback дополнительные параметры]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=410&amp;type=atom" />
	<updated>2022-10-12T16:59:36Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=410</id>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3828#p3828" />
			<content type="html"><![CDATA[<p>Вот так можно:</p><div class="codebox"><pre><code>static int my_pushcclosure_func(lua_State* L)
{
    std::cout &lt;&lt; &quot;------------------------------------------------&quot; &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;my_pushcclosure_func:&quot; &lt;&lt; lua_gettop(L) &lt;&lt; std::endl;

    std::cout &lt;&lt; &quot;PARAM1:&quot; &lt;&lt; lua_tostring(L, lua_upvalueindex(1)) &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;PARAM2:&quot; &lt;&lt; lua_tostring(L, lua_upvalueindex(2)) &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;------------------------------------------------&quot; &lt;&lt; std::endl;
}



    lua_pushstring(L, &quot;param1&quot;);
    lua_pushstring(L, &quot;param2&quot;);
    lua_pushcclosure(L, my_pushcclosure_func, 2);

    int status_lua_pcall = lua_pcall(L, 0, 0, 0);  </code></pre></div>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-12T16:59:36Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3828#p3828</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3824#p3824" />
			<content type="html"><![CDATA[<p>...</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-12T07:15:46Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3824#p3824</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3821#p3821" />
			<content type="html"><![CDATA[<p>Технические моменты с Lua-API для этого все разобраны, как я понимаю.<br />Осталось сделать нужную функцию на С++ - да и все.<br />Так мне видится на данный момент <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-12T05:00:46Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3821#p3821</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3820#p3820" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Я про другое. Ок, вы зачем-то хотите писать робота полностью на C++. Пусть так.<br />Но зачем тащить Lua-подходы при этом = вот в чем вопрос.</p><p>До этого ваши вопросы касались по сути Lua API и как что в нем реализовать. Это понятно, без этого никак.<br />Но в данном случае, на мой взгляд, это уже копирование специфичных именно для Lua-практик, которые вовсе не обязательно тянуть в C++ код. На мой взгляд.</p></blockquote></div><p>Да я толбко рад буду, если это можно решить без Lua.</p><p>Ну вот сосбвенно задача над которой я уже неделю с бьюсь, без Вашей помощи было еще дольше <img src="https://quik2dde.ru/img/smilies/smile.png" width="15" height="15" alt="smile" /></p><p>Задача: <br />-вызвав функцию C++ и получить std::vector&lt;my_struct&gt; данные исторических свечей.<br />-вызвав функцию C++ и получить в my_struct данные свечи изменений свечи.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-11T17:52:36Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3820#p3820</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3819#p3819" />
			<content type="html"><![CDATA[<p>Я про другое. Ок, вы зачем-то хотите писать робота полностью на C++. Пусть так.<br />Но зачем тащить Lua-подходы при этом = вот в чем вопрос.</p><p>До этого ваши вопросы касались по сути Lua API и как что в нем реализовать. Это понятно, без этого никак.<br />Но в данном случае, на мой взгляд, это уже копирование специфичных именно для Lua-практик, которые вовсе не обязательно тянуть в C++ код. На мой взгляд.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-11T16:30:47Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3819#p3819</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3818#p3818" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Но в целом я не совсем понимаю зачем вы в С++ переносите Lua-подходы. В С++, раз уж мы там, можно использовать свои подходы. Иначе зачем вообще переходить на С++, только лишняя морока.</p></blockquote></div><p>То, что морока - это я полностью согласен.<br />Я не хочу, чтобы с скрипте Квика был какой либо код - кроме одного, который вызывает С++ - функцию и внутри уже которой будет весь код, который дергает Квик из С++.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-11T13:15:29Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3818#p3818</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3817#p3817" />
			<content type="html"><![CDATA[<p>Но в целом я не совсем понимаю зачем вы в С++ переносите Lua-подходы. В С++, раз уж мы там, можно использовать свои подходы. Иначе зачем вообще переходить на С++, только лишняя морока.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-11T12:48:48Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3817#p3817</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3816#p3816" />
			<content type="html"><![CDATA[<p>Вообще да, занятная штука эти &quot;замыкания&quot; в Lua. Из них доступен локальный контекст, который являлся окружением &quot;замыкания&quot; (closure) на момент его создания.</p><p>Накидал такой примерчик (по мотивам кода про CreateDataSource):</p><div class="codebox"><pre><code>function cb(idx) 
  print(&#039;cb aa=&#039;, a) 
  print(&#039;cb idx=&#039;, idx) 
end 

function GetT(f)
   print(&#039;GetT a=&#039;, a)
   return {1,&#039;zZ&#039;, func=f}
end

local a = 5

t = GetT(function(idx) print(&#039;aa=&#039;, a) print(&#039;idx=&#039;, idx) end )
t1 = GetT(cb)

a = 8

t.func(55)
t1.func(66)

a = 99
t.func(33)</code></pre></div><p>Попробовать можно здесь:<br />[url]https://qlua.ru/demo/[/url]</p><p>Выводит:<br /></p><div class="codebox"><pre><code>GetT a= nil  &lt;-- из простых функций не видим локальную переменную a
GetT a= nil

aa= 8        &lt;-- это вызов t.func(55), где в таблице t - замыкание; здесь видно значение a, причем уже обновленное! 
idx= 55

cb aa= nil   &lt;-- а это вызов t1.func(66), где просто функция вызывается; в ней уже переменная a недоступна
cb idx= 66

aa= 99       &lt;-- и снова вызов t.func(99), здесь снова видно обновлённое значение a
idx= 33</code></pre></div>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-11T12:47:30Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3816#p3816</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3815#p3815" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>Похоже нужно делать через lua_pushcclosure, пока не понял как.</p></blockquote></div><p>Подробный пример здесь:<br />[url]http://www.lua.org/pil/27.3.3.html[/url]</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-11T12:39:49Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3815#p3815</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3814#p3814" />
			<content type="html"><![CDATA[<p>Похоже нужно делать через lua_pushcclosure, пока не понял как.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-11T11:16:19Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3814#p3814</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3813#p3813" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>По-моему, в данном случае просто назначаемая в SetUpdateCallback функция callback вызывает другую функцию, куда передает дополнительные параметры из глобальных переменных. Это на любом языке сделать можно</p></blockquote></div><p>Это все хорошо, но ОТКУДА в вызываемой SetUpdateCallback функции возьмутся мои передаваемые значения ?? В эту функцию приходит Lua-стек только с одними данными - индексом свечи.</p><p>В этом и вопрос, как передать туда дополнительные данные.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-11T11:08:41Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3813#p3813</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3812#p3812" />
			<content type="html"><![CDATA[<p>По-моему, в данном случае просто назначаемая в SetUpdateCallback функция callback вызывает другую функцию, куда передает дополнительные параметры из глобальных переменных. Это на любом языке сделать можно</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-10-11T10:36:47Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3812#p3812</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Передать в SetUpdateCallback дополнительные параметры]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3811#p3811" />
			<content type="html"><![CDATA[<p>И я опять с вопросом.</p><p>При вызове SetUpdateCallback по умолчанию передать туда доп. параметры нельзя:</p><br /><div class="codebox"><pre><code>function my_callback_(index)

--index - индекс свечи в таблице my_table, НО сама таблица по умолчанию не приходит, что просто дикость.

end


local my_table = CreateDataSource(code_class, code_paper_ interval)

my_table :SetUpdateCallback(my_callback_)</code></pre></div><br /><br /><p>Но, передать доп. параметры в callback - можно с помощью такой контракции, в данном случае я не знаю, что она означает на Lua, просто подсмотрел в интернете:</p><div class="codebox"><pre><code>function my_callback_(my_table_, param1, param2, index)

--Теперь тут доступны переданные дополнительные параметры...my_table_, param1, param2 - помимо стандартного index

end


local my_table = CreateDataSource(code_class, code_paper_ interval)

parametr_1 = &quot;1&quot;
parametr_2 = &quot;2&quot;

my_table :SetUpdateCallback(function(idx)my_callback_(my_table,parametr_1, parametr_2, idx) end)</code></pre></div><p>И теперь параметры замечательно переданы в callback SetUpdateCallback.</p><br /><p>И вот подскажите пожалуйста, а можно ли подобное провернуть в Си ??</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-10-11T09:18:43Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3811#p3811</id>
		</entry>
</feed>
