<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[QUIK -> DDE &mdash; lua_pushstring - что делает ?]]></title>
	<link rel="self" href="https://quik2dde.ru/extern.php?action=feed&amp;tid=385&amp;type=atom" />
	<updated>2022-09-24T18:18:01Z</updated>
	<generator>PunBB</generator>
	<id>https://quik2dde.ru/viewtopic.php?id=385</id>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3635#p3635" />
			<content type="html"><![CDATA[<p>Из документации, обратите внимание на комментарий:<br /></p><div class="codebox"><pre><code>return 1;  /* number of results */</code></pre></div><p>[url]https://www.lua.org/pil/26.1.html[/url]</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-24T18:18:01Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3635#p3635</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3634#p3634" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>Или что в Вашем понимании кол-во ? Кол-во чего ?</p></blockquote></div><div class="quotebox"><cite>swerg пишет:</cite><blockquote><p> return(1) говорит, что функция возвращает 1 параметр (функции в Lua могут не возвращать никакое значение, либо возвращать одно или несколько результирующих значений любых типов, не только один результат).</p></blockquote></div><p>Иногда у меня складывается впечатление, что вы не читаете ответы.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-24T18:15:23Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3634#p3634</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3633#p3633" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Почему &quot;под соответствующим номером&quot;? Это количество же.</p></blockquote></div><p>Ну тесты показывают, что это именно номер элемента в стеке. Причем нумерация начинается с вершины стека.<br />Или что в Вашем понимании кол-во ? Кол-во чего ?</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-09-24T16:37:50Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3633#p3633</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3631#p3631" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>return 2,3 ... - возвращает в вызывавшую функцию элемент стека под соответствующим номером.</p></blockquote></div><p>Почему &quot;под соответствующим номером&quot;? Это количество же.</p><div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>Что, если я хочу передать более одного элемента обратно в функцию ?</p></blockquote></div><p>Если определённое количество результатов - то вызывайте функции push_xxx столько раз, сколько возвращаемых значений, после чего в return впишите количество возвращаемых из функции в Lua значений.</p><p>В Lua синтаксисе Lua несколько результатов, возвращаемых из функции, получаются следующим синтаксисом:<br /></p><div class="codebox"><pre><code>function MyFunc()
   x = 5
   y = 6 * x
   s = &#039;ABC&#039;
   return x, y, s
end

a,b,c = MyFunc()</code></pre></div><div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>А можно ли вернуть весь стек ?</p></blockquote></div><p>Не знаю. Вопрос в том, как вы это будете читать в Lua?</p><p>Если требуется вернуть произвольное (переменное) количество результатов - просто возвращайте таблицу из функции.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-24T15:45:04Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3631#p3631</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3628#p3628" />
			<content type="html"><![CDATA[<p>Извините позвольте пожалуйста еще один вопрос.</p><p>Вот return 1 или return 2,3 ... - возвращает в вызывавшую функцию элемент стека под соответствующим номером. <br />А можно ли вернуть весь стек ? Что, если я хочу передать более одного элемента обратно в функцию ?</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-09-24T12:41:13Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3628#p3628</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3624#p3624" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>Стек уничтожается или продолжает существовать ? Нужно ли его очищать ?</p></blockquote></div><p>Стек, разумеется, продолжает существовать. Он существует все время, пока выполняется Lua скрипт. (см. примеры в гугле <em>&quot;как встроить Lua в свою программу на Си&quot;</em>)</p><p>Если речь просто про принять значения / вернуть значения, то там довольно простые паттерны кода (см. примеры), сверх этого ничего чистить / освобождать не требуется.</p><p>Если же хочется чуть глубже понять методы работы со стеком и что там в какой момент происходит, но загуглите и посмотрите статьи / примеры на тему <em>&quot;как вернуть таблицу в Lua-код из функции на Си&quot;</em> и <em>&quot;как в Си-функцию передать таблицу из Lua-скрипта&quot;</em>. Я на память не подскажу что там как устроено, не помню, но в таких ситуациях уже надо получше знать как устроен стек, какие из него элементы когда требуется или не требуется удалить и т.д. Соответственно такого рода статьи все это описывают более глубоко.</p><p>Еще детальнее если захочется понимания - почитать как с метатаблицами Lua работать из Си-кода.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-23T05:55:38Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3624#p3624</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3622#p3622" />
			<content type="html"><![CDATA[<p>Прочитал по двум Вашим ссылкам.<br />Не смог найти такую информацию: что происходит со стеком, после того, как функция в Си завешается и возвращает значение в Lua ? <br />Стек уничтожается или продолжает существовать ? Нужно ли его очищать ?</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-09-22T18:01:37Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3622#p3622</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3621#p3621" />
			<content type="html"><![CDATA[<p>Дошел до описания:</p><div class="quotebox"><blockquote><p>Так, например, если стэк содержит 10 переменных, то return(2) вернет 9-ую и 10-ую переменную в Lua.</p></blockquote></div><p>Теперь понял, что return Lua, это не return Си.</p><p>Спасибо за ссылку.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-09-22T17:56:13Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3621#p3621</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3620#p3620" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Вероятно вы хотели сказать &quot;<em>а не возвращенный код <strong>1</strong>, который я возвращаю из функции TestFunc()</em>&quot;. Да?</p><p>Потому что, как я уже писал, функция forLua_TestFunc() возвращает <strong>количество</strong> возвращенных ею на стеке Lua значений ...</p></blockquote></div><p>Вот этот момент я никак не могу понять. Что значит &quot;функция forLua_TestFunc() возвращает <strong>количество</strong> возвращенных ею на стеке Lua значений&quot; ??<br />Функция в Cи, как я понимаю и в Lua - возвращает именно то, что указано в return, а в return я могу указать все что угодно - хоть 2, хоть 22.</p><br /><p>PS: Ваши ссылки уже читаю.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-09-22T17:50:29Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3620#p3620</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3619#p3619" />
			<content type="html"><![CDATA[<p>Я не знаю что вы читали, но я сдаюсь.<br />Давайте я кину пару ссылок, где вроде разжёвываются все концепции взаимодействия Lua и Си кода.<br />Как в общем объяснить сверх того, что там написано - я не знаю.</p><p>[url]https://smart-lab.ru/blog/611041.php[/url]<br />[url]https://bot4sale.ru/blog-menu/qlua/spisok-statej/308-c-api-lua.html[/url]</p><p>Надеюсь, эти материалы помогут вам понять суть и идею.</p><div class="quotebox"><cite>Serg_ пишет:</cite><blockquote><p>А когда выполняю message(tostring(status)) - то выводится &quot;Hello_1&quot;, а не возвращенный код 2, который я возвращаю из функции TestFunc().</p></blockquote></div><p>Вероятно вы хотели сказать &quot;<em>а не возвращенный код <strong>1</strong>, который я возвращаю из функции TestFunc()</em>&quot;. Да?</p><p>Потому что, как я уже писал, функция forLua_TestFunc() возвращает <strong>количество</strong> возвращенных ею на стеке Lua значений (в вашем случае одно значение, потому и return 1). А само значение, которое мы хотим вернуть, мы кладем на вершину стека Lua через вызов lua_pushstring. Причем поскольку это lua_push<strong>string</strong>, то возвращаем мы именно тип &quot;строка&quot;. Не число, не bool, ни что-либо другое. Именно строковый тип, строку.</p><p>Кстати, сам стек Lua (указатель на него) - это как раз та самая переменная L, которая вам всегда передаётся в Си-функции.</p>]]></content>
			<author>
				<name><![CDATA[swerg]]></name>
				<uri>https://quik2dde.ru/profile.php?id=78</uri>
			</author>
			<updated>2022-09-22T17:18:26Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3619#p3619</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3618#p3618" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>swerg пишет:</cite><blockquote><p>Говоря кратко - lua_pushstring добавляет строковый параметр на стек, а return(1) говорит, что функция возвращает 1 параметр (функции в Lua могут не возвращать никакое значение, либо возвращать одно или несколько результирующих значений любых типов, не только один результат).</p></blockquote></div><p>Я вроде бы почитал, но все равно, что то &quot;недогоняю&quot;. Вот cкрипт:</p><div class="codebox"><pre><code>Quil_Lua_connector = require(&quot;Quil_Lua_connector&quot;)

status = Quil_Lua_connector.TestFunc(&quot;Hello_1&quot;, &quot;Hello_2&quot;)

message(tostring(status))
message(tostring(2))</code></pre></div><p>Почему когда я выполняю message(tostring(2)) - то выводится сообщение 2.<br />А когда выполняю message(tostring(status)) - то выводится &quot;Hello_1&quot;, а не возвращенный код 2, который я возвращаю из функции TestFunc().</p><p>Реально не могу понять.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-09-22T16:27:29Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3618#p3618</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3615#p3615" />
			<content type="html"><![CDATA[<p>Говоря кратко - lua_pushstring добавляет строковый параметр на стек, а return(1) говорит, что функция возвращает 1 параметр (функции в Lua могут не возвращать никакое значение, либо возвращать одно или несколько результирующих значений любых типов, не только один результат).</p><p>Еще раз обращусь к вам с просьбой: почитайте сначала статьи на тему взаимодействия Lua в С++ коде. Что такое стек в виртуальной машине Lua, как в него передаются / принимаются параметры, как там значения индексируются и т.д. А также посмотрите примеры на Си для Lua, которых в сети много, или минимальные примеры из демо-библиотеки на этом сайте: как там принимаются параметры, как возвращаются значения и т.д.<br />[url]https://quik2dde.ru/viewtopic.php?id=18[/url]</p><p>API там несложное, но все же его надо изучить.</p><p>Когда уже статьи будут прочитаны и по ходу применения знаний будут возникать предметные вопросы - тогда велкам.</p><p>А так получается на форуме надо написать статью по работе с Lua из Си именно для вас. Вряд ли кто-то возьмётся за такое <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-09-21T21:23:39Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3615#p3615</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[lua_pushstring - что делает ?]]></title>
			<link rel="alternate" href="https://quik2dde.ru/viewtopic.php?pid=3612#p3612" />
			<content type="html"><![CDATA[<p>Позвольте задать вопрос.</p><p>Читаю описание к Push-функциям: [url]https://www.lua.org/pil/24.2.1.html[/url]</p><p>Push-функции помещают значение в некий виртуальный стек.</p><p>Но меня интересует вопрос немного другой.</p><p>Почему, когда при запуске скрипта Quik Lua:</p><div class="codebox"><pre><code>Quil_Lua_connector = require(&quot;Quil_Lua_connector&quot;)
message(Quil_Lua_connector.TestFunc())</code></pre></div><p>вызывается функция из Си:</p><div class="codebox"><pre><code>static int forLua_TestFunc(lua_State* L) 
{
    lua_pushstring(L, &quot;Привет из C/C++&quot;);
    return(1);
}</code></pre></div><br /><p>То результатом является появление инфобокса в Quik`е c надписью &quot;Привет из C/C++&quot; - ведь возвращенное значение 0 это int &quot;return 1&quot; - то есть message(1) - почему выводится текст, который как бы был помещен в стек.</p>]]></content>
			<author>
				<name><![CDATA[Serg_]]></name>
				<uri>https://quik2dde.ru/profile.php?id=3371</uri>
			</author>
			<updated>2022-09-21T17:39:49Z</updated>
			<id>https://quik2dde.ru/viewtopic.php?pid=3612#p3612</id>
		</entry>
</feed>
