1

Тема: lua_pushstring - что делает ?

Позвольте задать вопрос.

Читаю описание к Push-функциям: [url]https://www.lua.org/pil/24.2.1.html[/url]

Push-функции помещают значение в некий виртуальный стек.

Но меня интересует вопрос немного другой.

Почему, когда при запуске скрипта Quik Lua:

Quil_Lua_connector = require("Quil_Lua_connector")
message(Quil_Lua_connector.TestFunc())

вызывается функция из Си:

static int forLua_TestFunc(lua_State* L) 
{
    lua_pushstring(L, "Привет из C/C++");
    return(1);
}

То результатом является появление инфобокса в Quik`е c надписью "Привет из C/C++" - ведь возвращенное значение 0 это int "return 1" - то есть message(1) - почему выводится текст, который как бы был помещен в стек.

2 (2022-09-22 01:24:20 отредактировано swerg)

Re: lua_pushstring - что делает ?

Говоря кратко - lua_pushstring добавляет строковый параметр на стек, а return(1) говорит, что функция возвращает 1 параметр (функции в Lua могут не возвращать никакое значение, либо возвращать одно или несколько результирующих значений любых типов, не только один результат).

Еще раз обращусь к вам с просьбой: почитайте сначала статьи на тему взаимодействия Lua в С++ коде. Что такое стек в виртуальной машине Lua, как в него передаются / принимаются параметры, как там значения индексируются и т.д. А также посмотрите примеры на Си для Lua, которых в сети много, или минимальные примеры из демо-библиотеки на этом сайте: как там принимаются параметры, как возвращаются значения и т.д.
[url]https://quik2dde.ru/viewtopic.php?id=18[/url]

API там несложное, но все же его надо изучить.

Когда уже статьи будут прочитаны и по ходу применения знаний будут возникать предметные вопросы - тогда велкам.

А так получается на форуме надо написать статью по работе с Lua из Си именно для вас. Вряд ли кто-то возьмётся за такое smile

3

Re: lua_pushstring - что делает ?

swerg пишет:

Говоря кратко - lua_pushstring добавляет строковый параметр на стек, а return(1) говорит, что функция возвращает 1 параметр (функции в Lua могут не возвращать никакое значение, либо возвращать одно или несколько результирующих значений любых типов, не только один результат).

Я вроде бы почитал, но все равно, что то "недогоняю". Вот cкрипт:

Quil_Lua_connector = require("Quil_Lua_connector")

status = Quil_Lua_connector.TestFunc("Hello_1", "Hello_2")

message(tostring(status))
message(tostring(2))

Почему когда я выполняю message(tostring(2)) - то выводится сообщение 2.
А когда выполняю message(tostring(status)) - то выводится "Hello_1", а не возвращенный код 2, который я возвращаю из функции TestFunc().

Реально не могу понять.

4

Re: lua_pushstring - что делает ?

Я не знаю что вы читали, но я сдаюсь.
Давайте я кину пару ссылок, где вроде разжёвываются все концепции взаимодействия Lua и Си кода.
Как в общем объяснить сверх того, что там написано - я не знаю.

[url]https://smart-lab.ru/blog/611041.php[/url]
[url]https://bot4sale.ru/blog-menu/qlua/spisok-statej/308-c-api-lua.html[/url]

Надеюсь, эти материалы помогут вам понять суть и идею.

Serg_ пишет:

А когда выполняю message(tostring(status)) - то выводится "Hello_1", а не возвращенный код 2, который я возвращаю из функции TestFunc().

Вероятно вы хотели сказать "а не возвращенный код 1, который я возвращаю из функции TestFunc()". Да?

Потому что, как я уже писал, функция forLua_TestFunc() возвращает количество возвращенных ею на стеке Lua значений (в вашем случае одно значение, потому и return 1). А само значение, которое мы хотим вернуть, мы кладем на вершину стека Lua через вызов lua_pushstring. Причем поскольку это lua_pushstring, то возвращаем мы именно тип "строка". Не число, не bool, ни что-либо другое. Именно строковый тип, строку.

Кстати, сам стек Lua (указатель на него) - это как раз та самая переменная L, которая вам всегда передаётся в Си-функции.

5 (2022-09-22 21:53:20 отредактировано Serg_)

Re: lua_pushstring - что делает ?

swerg пишет:

Вероятно вы хотели сказать "а не возвращенный код 1, который я возвращаю из функции TestFunc()". Да?

Потому что, как я уже писал, функция forLua_TestFunc() возвращает количество возвращенных ею на стеке Lua значений ...

Вот этот момент я никак не могу понять. Что значит "функция forLua_TestFunc() возвращает количество возвращенных ею на стеке Lua значений" ??
Функция в Cи, как я понимаю и в Lua - возвращает именно то, что указано в return, а в return я могу указать все что угодно - хоть 2, хоть 22.


PS: Ваши ссылки уже читаю.

6

Re: lua_pushstring - что делает ?

Дошел до описания:

Так, например, если стэк содержит 10 переменных, то return(2) вернет 9-ую и 10-ую переменную в Lua.

Теперь понял, что return Lua, это не return Си.

Спасибо за ссылку.

7

Re: lua_pushstring - что делает ?

Прочитал по двум Вашим ссылкам.
Не смог найти такую информацию: что происходит со стеком, после того, как функция в Си завешается и возвращает значение в Lua ?
Стек уничтожается или продолжает существовать ? Нужно ли его очищать ?

8 (2022-09-23 09:55:56 отредактировано swerg)

Re: lua_pushstring - что делает ?

Serg_ пишет:

Стек уничтожается или продолжает существовать ? Нужно ли его очищать ?

Стек, разумеется, продолжает существовать. Он существует все время, пока выполняется Lua скрипт. (см. примеры в гугле "как встроить Lua в свою программу на Си")

Если речь просто про принять значения / вернуть значения, то там довольно простые паттерны кода (см. примеры), сверх этого ничего чистить / освобождать не требуется.

Если же хочется чуть глубже понять методы работы со стеком и что там в какой момент происходит, но загуглите и посмотрите статьи / примеры на тему "как вернуть таблицу в Lua-код из функции на Си" и "как в Си-функцию передать таблицу из Lua-скрипта". Я на память не подскажу что там как устроено, не помню, но в таких ситуациях уже надо получше знать как устроен стек, какие из него элементы когда требуется или не требуется удалить и т.д. Соответственно такого рода статьи все это описывают более глубоко.

Еще детальнее если захочется понимания - почитать как с метатаблицами Lua работать из Си-кода.

9

Re: lua_pushstring - что делает ?

Извините позвольте пожалуйста еще один вопрос.

Вот return 1 или return 2,3 ... - возвращает в вызывавшую функцию элемент стека под соответствующим номером.
А можно ли вернуть весь стек ? Что, если я хочу передать более одного элемента обратно в функцию ?

10

Re: lua_pushstring - что делает ?

Serg_ пишет:

return 2,3 ... - возвращает в вызывавшую функцию элемент стека под соответствующим номером.

Почему "под соответствующим номером"? Это количество же.

Serg_ пишет:

Что, если я хочу передать более одного элемента обратно в функцию ?

Если определённое количество результатов - то вызывайте функции push_xxx столько раз, сколько возвращаемых значений, после чего в return впишите количество возвращаемых из функции в Lua значений.

В Lua синтаксисе Lua несколько результатов, возвращаемых из функции, получаются следующим синтаксисом:

function MyFunc()
   x = 5
   y = 6 * x
   s = 'ABC'
   return x, y, s
end

a,b,c = MyFunc()
Serg_ пишет:

А можно ли вернуть весь стек ?

Не знаю. Вопрос в том, как вы это будете читать в Lua?

Если требуется вернуть произвольное (переменное) количество результатов - просто возвращайте таблицу из функции.

11

Re: lua_pushstring - что делает ?

swerg пишет:

Почему "под соответствующим номером"? Это количество же.

Ну тесты показывают, что это именно номер элемента в стеке. Причем нумерация начинается с вершины стека.
Или что в Вашем понимании кол-во ? Кол-во чего ?

12

Re: lua_pushstring - что делает ?

Serg_ пишет:

Или что в Вашем понимании кол-во ? Кол-во чего ?

swerg пишет:

return(1) говорит, что функция возвращает 1 параметр (функции в Lua могут не возвращать никакое значение, либо возвращать одно или несколько результирующих значений любых типов, не только один результат).

Иногда у меня складывается впечатление, что вы не читаете ответы.

13 (2022-09-26 07:02:14 отредактировано swerg)

Re: lua_pushstring - что делает ?

Из документации, обратите внимание на комментарий:

return 1;  /* number of results */

[url]https://www.lua.org/pil/26.1.html[/url]