1 (2022-10-11 13:20:56 отредактировано Serg_)

Тема: Передать в SetUpdateCallback дополнительные параметры

И я опять с вопросом.

При вызове SetUpdateCallback по умолчанию передать туда доп. параметры нельзя:


function my_callback_(index)

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

end


local my_table = CreateDataSource(code_class, code_paper_ interval)

my_table :SetUpdateCallback(my_callback_)


Но, передать доп. параметры в callback - можно с помощью такой контракции, в данном случае я не знаю, что она означает на Lua, просто подсмотрел в интернете:

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 = "1"
parametr_2 = "2"

my_table :SetUpdateCallback(function(idx)my_callback_(my_table,parametr_1, parametr_2, idx) end)

И теперь параметры замечательно переданы в callback SetUpdateCallback.


И вот подскажите пожалуйста, а можно ли подобное провернуть в Си ??

2

Re: Передать в SetUpdateCallback дополнительные параметры

По-моему, в данном случае просто назначаемая в SetUpdateCallback функция callback вызывает другую функцию, куда передает дополнительные параметры из глобальных переменных. Это на любом языке сделать можно

3

Re: Передать в SetUpdateCallback дополнительные параметры

swerg пишет:

По-моему, в данном случае просто назначаемая в SetUpdateCallback функция callback вызывает другую функцию, куда передает дополнительные параметры из глобальных переменных. Это на любом языке сделать можно

Это все хорошо, но ОТКУДА в вызываемой SetUpdateCallback функции возьмутся мои передаваемые значения ?? В эту функцию приходит Lua-стек только с одними данными - индексом свечи.

В этом и вопрос, как передать туда дополнительные данные.

4

Re: Передать в SetUpdateCallback дополнительные параметры

Похоже нужно делать через lua_pushcclosure, пока не понял как.

5

Re: Передать в SetUpdateCallback дополнительные параметры

Serg_ пишет:

Похоже нужно делать через lua_pushcclosure, пока не понял как.

Подробный пример здесь:
[url]http://www.lua.org/pil/27.3.3.html[/url]

6

Re: Передать в SetUpdateCallback дополнительные параметры

Вообще да, занятная штука эти "замыкания" в Lua. Из них доступен локальный контекст, который являлся окружением "замыкания" (closure) на момент его создания.

Накидал такой примерчик (по мотивам кода про CreateDataSource):

function cb(idx) 
  print('cb aa=', a) 
  print('cb idx=', idx) 
end 

function GetT(f)
   print('GetT a=', a)
   return {1,'zZ', func=f}
end

local a = 5

t = GetT(function(idx) print('aa=', a) print('idx=', idx) end )
t1 = GetT(cb)

a = 8

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

a = 99
t.func(33)

Попробовать можно здесь:
[url]https://qlua.ru/demo/[/url]

Выводит:

GetT a= nil  <-- из простых функций не видим локальную переменную a
GetT a= nil

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

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

aa= 99       <-- и снова вызов t.func(99), здесь снова видно обновлённое значение a
idx= 33

7

Re: Передать в SetUpdateCallback дополнительные параметры

Но в целом я не совсем понимаю зачем вы в С++ переносите Lua-подходы. В С++, раз уж мы там, можно использовать свои подходы. Иначе зачем вообще переходить на С++, только лишняя морока.

8

Re: Передать в SetUpdateCallback дополнительные параметры

swerg пишет:

Но в целом я не совсем понимаю зачем вы в С++ переносите Lua-подходы. В С++, раз уж мы там, можно использовать свои подходы. Иначе зачем вообще переходить на С++, только лишняя морока.

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

9

Re: Передать в SetUpdateCallback дополнительные параметры

Я про другое. Ок, вы зачем-то хотите писать робота полностью на C++. Пусть так.
Но зачем тащить Lua-подходы при этом = вот в чем вопрос.

До этого ваши вопросы касались по сути Lua API и как что в нем реализовать. Это понятно, без этого никак.
Но в данном случае, на мой взгляд, это уже копирование специфичных именно для Lua-практик, которые вовсе не обязательно тянуть в C++ код. На мой взгляд.

10

Re: Передать в SetUpdateCallback дополнительные параметры

swerg пишет:

Я про другое. Ок, вы зачем-то хотите писать робота полностью на C++. Пусть так.
Но зачем тащить Lua-подходы при этом = вот в чем вопрос.

До этого ваши вопросы касались по сути Lua API и как что в нем реализовать. Это понятно, без этого никак.
Но в данном случае, на мой взгляд, это уже копирование специфичных именно для Lua-практик, которые вовсе не обязательно тянуть в C++ код. На мой взгляд.

Да я толбко рад буду, если это можно решить без Lua.

Ну вот сосбвенно задача над которой я уже неделю с бьюсь, без Вашей помощи было еще дольше smile

Задача:
-вызвав функцию C++ и получить std::vector<my_struct> данные исторических свечей.
-вызвав функцию C++ и получить в my_struct данные свечи изменений свечи.

11

Re: Передать в SetUpdateCallback дополнительные параметры

Технические моменты с Lua-API для этого все разобраны, как я понимаю.
Осталось сделать нужную функцию на С++ - да и все.
Так мне видится на данный момент smile

12 (2022-10-12 16:24:08 отредактировано Serg_)

Re: Передать в SetUpdateCallback дополнительные параметры

...

13 (2022-10-12 20:59:44 отредактировано Serg_)

Re: Передать в SetUpdateCallback дополнительные параметры

Вот так можно:

static int my_pushcclosure_func(lua_State* L)
{
    std::cout << "------------------------------------------------" << std::endl;
    std::cout << "my_pushcclosure_func:" << lua_gettop(L) << std::endl;

    std::cout << "PARAM1:" << lua_tostring(L, lua_upvalueindex(1)) << std::endl;
    std::cout << "PARAM2:" << lua_tostring(L, lua_upvalueindex(2)) << std::endl;
    std::cout << "------------------------------------------------" << std::endl;
}



    lua_pushstring(L, "param1");
    lua_pushstring(L, "param2");
    lua_pushcclosure(L, my_pushcclosure_func, 2);

    int status_lua_pcall = lua_pcall(L, 0, 0, 0);