Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
96 / 1 / 0
Регистрация: 04.10.2022
Сообщений: 41

Передача в функцию обратного вызова доп. параметров

11.10.2022, 12:42. Показов 1062. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста, что эта за конструкция передачи параметров в функцию ?


Вот есть такая "прямолинейная" конструкция:

C
1
2
3
4
5
6
7
8
function my_callback_(index)
--....
end
 
 
local my_table = CreateDataSource(code_class, code_paper_ interval)
 
my_table :SetUpdateCallback(my_callback_) -- вызываю метод SetUpdateCallback, которая принимает на Вход только функцию.
То есть метод SetUpdateCallback - принимает на вход только функцию, которая будет вызываться по мере готовности и соответственно в саму callback функцию передать доп.параметры стандартным способом нет.




Однако можно сделать вот так:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
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)
Я не могу понять, как это реализовано ?? Как это работает ? И самое главное можно ли это как то реализовать на Си ?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2022, 12:42
Ответы с готовыми решениями:

Передача параметров в метод обратного вызова?
Здравствуйте. Пытаюсь передать параметр в метод обратного вызова на событие OnSuccess метода Ajax.BeginForm. И так:...

Передача аргументов в функцию обратного вызова
Нихао. $new_array = array_filter($ai, 'filter_available'); Если мне в функции filter_available нужен определенного рода массив, могу ли...

Передача функций обратного вызова как членов некоторого класса
Пытаюсь понемногу изучать OpenGL, и вот сейчас столкнулся с такой проблемой: Имеется некоторый класс, содержащий вектор и пару...

4
Модератор
 Аватар для Curry
5158 / 3490 / 536
Регистрация: 01.06.2013
Сообщений: 7,581
Записей в блоге: 9
11.10.2022, 13:29
Лучший ответ Сообщение было отмечено Lunar_ как решение

Решение

Замыкание.
В С нет. В С++ есть начиная со стандарта С++11.
На С можно сделать вручную передавая в функцию свою структуру с адресом функции и void* который тоже передавать при вызове функции через указатель.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
 
typedef void (*MyFun)(void*);
 
typedef struct  {
    MyFun f;
    void* data;
} MyClosure;
 
void foo(void* p){
    printf("%d\n", *((int*)p));
}
 
void bar(MyClosure* p){
    p->f(p->data);
}
 
int main() {
    int i=28;
    MyClosure c={&foo,&i};
    bar(&c);
    return 0;
}
Ну, или для каждой ситуации делать свою структуру с нужными данными. Всё равно не типобезопасно, С есть С.
2
 Аватар для vantfiles
1018 / 1919 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
11.10.2022, 17:24
Цитата Сообщение от Curry Посмотреть сообщение
Замыкание.
Это не замыкание ни разу.
Обычный функциональный указатель + лямбда, она же неименованная функция.

Lua
1
2
3
4
5
6
7
8
my_table :SetUpdateCallback(my_callback_) -- вызываю метод SetUpdateCallback, которая принимает на Вход только функцию.
 
-- это можно сразу записать как:
my_table :SetUpdateCallback(
  function( index)
    -- Здесь обработчик каллбэка
  end
)
Замыкание определяется просто: "Замыкание — использование локальных переменных объемлющей функции внутри вложенной."

И все.

Но есть нюанс. Если объемлющая ф-ция является порождающей, то есть возвращает вложенную ф-цию, локальные переменные объемлющей функции становятся для вложенной "персональными". Проще показать:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function make_power( n )
  local pwr = n -- вот она, локальная переменная
  return
    function( x ) -- а возвращаем мы лямбду
      local res = 1
      for i = 1, pwr do -- возводим в заданную натуральную степень
         res = res * x
      end
      return res -- возвращаем степень
    end
end
 
power2 = make_power( 2 )
power3 = make_power( 3 )
power4 = make_power( 4 )
 
print( power2( 2 ) ) -- 4
print( power3( 2 ) ) -- 8
print( power4( 2 ) ) -- 16
2
Модератор
 Аватар для Curry
5158 / 3490 / 536
Регистрация: 01.06.2013
Сообщений: 7,581
Записей в блоге: 9
11.10.2022, 18:25
Цитата Сообщение от vantfiles Посмотреть сообщение
Это не замыкание ни разу.
Это замыкание.
Цитата Сообщение от vantfiles Посмотреть сообщение
Замыкание определяется просто: "Замыкание — использование локальных переменных объемлющей функции внутри вложенной."

Тогда вот это по вашему тоже замыкание
Pascal
1
2
3
4
5
6
7
8
9
10
11
program Hello;
var
    i:integer;
    procedure foo;
    begin
      writeln (i);
    end;
begin
    i:=28;
    foo;
end.
С другой стороны, по вашему определению приведённый ТС код
Lua
1
my_table :SetUpdateCallback(function(idx)my_callback_(my_table,parametr_1, parametr_2, idx) end)
как раз замыкание, внутри лямбы "используются локальные переменные объемлющей функции". То есть он замыкание по другой причине, но и из вашего же "определения" тоже. )
0
 Аватар для vantfiles
1018 / 1919 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
11.10.2022, 19:24
Цитата Сообщение от Curry Посмотреть сообщение
Это замыкание.
Вот замыкание: https://dic.academic.ru/dic.nsf/ruwiki/91875
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.10.2022, 19:24
Помогаю со студенческими работами здесь

Передать результат функции в функцию обратного вызова
Доброго времени суток. Есть функция newDataSaving. Результат ее работы (массив student) надо передать в функцию обратного вызова -...

Как связать два класса используя функцию обратного вызова
Как связать два класса с помощью функции обратного вызова? есть класс add (записывает числа от 0 до 9) и класс с графическим интерфейсом...

Как правильно организовать функцию обратного вызова для внешней С-библиотеки?
Кароч. Подключил внешнюю dll. Есть там функция для регистрации функции обратного вызова. Прототип функции тоже есть. сделал в шарпе...

Передача доп. параметров по ссылке на меняя самой ссылки
Доброго времени суток всем. Вообщем такая задача. Есть список: &lt;li&gt;&lt;a href=&quot;catalog1.htm&quot;&gt;Ссылка1&lt;/a&gt; &lt;ul &gt; ...

Директивы и соглашения вызова процедур и передача параметров
Здравствуйте. Сразу говорю что не наглею, а прошу помощи в решении задачи: Задача: Логика работы программы следующая: вызывается функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru