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

Страницы: 1
RSS
Передать в 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.

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

 
Цитата
Quikos написал:
При вызове 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.  И вот подскажите пожалуйста, а можно ли подобное провернуть в Си ??
Вы можете передать любые параметры в любую функцию через внешние для нее параметры
Это могут быть либо глобальные либо локальные параметры блока
Например в вашем случае делаем так:
Код
 local param1,param2;
-------------------------------------
function my_callback_ (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 ( my_callback )
И не надо огород городить.
Вы можете таким же образом передать и таблицу и все что хотите.
 
Цитата
nikolz написал:
 Вы можете передать любые параметры в любую функцию через внешние для нее параметры
Это могут быть либо глобальные либо локальные параметры блока
Например в вашем случае делаем так:
Код
    local  param1,param2;
 ------------------------------------- 
 function  my_callback_ (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  ( my_callback )
  
И не надо огород городить.
Вы можете таким же образом передать и таблицу и все что хотите.

Не сочтите за наглость, Вы сами по поняли, что написали ?

1)Во первых даже если мы рассматриваем Lua - где тут передача параметров в функцию ? Я что спрашивал про глобальные параметры ? Почему вы вообще применяется к глобальным переменным термин "передать" ?? Это и так ГЛОБАЛЬНАЯ переменная.
2)Во вторых я четко спросил про Си, то есть, как это реализовать на Lua api в Си.

Будем откровенны - Вы написали очень глупую глупость :)
 
Вы привели пример лямбда функции.
SetUpdateCallback в качестве первого аргумента просит ссылку на функцию. Функцию можно объявить в переменную, можно без объявления как лямбду. Кажется в С++ 14 появилось и лямбы и замыкания.


Но Вам необходимо "захватить" переменные, чтобы они были видимы в итоговой исполняемой функции. Делать это можно и так как написали, но лучше использовать более явный подход. Вот на чистом lua:
Код
local function call_back_processor(var1, var2)
    return function(index)
        print(index, var1, var2)
    end
end

local my_call_back = call_back_processor('a', 'b')

my_call_back(1)
my_call_back(2)
my_call_back(3)
my_call_back(4)

Мы создаем замыкание с явной передаче переменных, требующих запоминания меду вызовами.

Для вашего случая можно сделать и через неявную функцию (лямбду):

my_table:SetUpdateCallback(call_back_processor('a', 'b'))

А можно и через явное объявление функции и передачи ее как параметра в SetUpdateCallback
 
Цитата
Quikos написал:
Цитата
nikolz написал:
 Вы можете передать любые параметры в любую функцию через внешние для нее параметры
Это могут быть либо глобальные либо локальные параметры блока
Например в вашем случае делаем так:
 
Код
       local   param1,param2;
  -------------------------------------  
  function   my_callback_ (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   ( my_callback )
    
 И не надо огород городить.
Вы можете таким же образом передать и таблицу и все что хотите.

Не сочтите за наглость, Вы сами по поняли, что написали ?

1)Во первых даже если мы рассматриваем Lua - где тут передача параметров в функцию ? Я что спрашивал про глобальные параметры ? Почему вы вообще применяется к глобальным переменным термин "передать" ?? Это и так ГЛОБАЛЬНАЯ переменная.
2)Во вторых я четко спросил про Си, то есть, как это реализовать на Lua api в Си.

Будем откровенны - Вы написали очень глупую глупость :)
Я вам пояснил, что указанное вами решение - это нагромождение огорода - именно для луа.
---------------------
В подсмотренном но не понятом Вами варианте , параметры будут загружаться в стек луа вне функциию
------------------------------
В моем варианте параметры определены как upvalue и будут загружены в стек  луа внутри функции.
-----------------
Разница лишь в том, что ваш вариант содержит больше букв .
-----------------
Если Вы не поняли, то что я Вам написал, то нет смысла объяснять Вам как это делать на СИ.
Вы это тем более не поймете.
 
Цитата
nikolz написал:

-----------------
Если Вы не поняли, то что я Вам написал, то нет смысла объяснять Вам как это делать на СИ.
Вы это тем более не поймете.

Так на Lua api C - вы и не знаете, как это сделать. Вы, как раз не понимаете/
 
Есть один проект - https://github.com/elelel/qluacpp
Найдете много ответов.
Страницы: 1
Читают тему
Наверх