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

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

11.10.2022, 12:42. Показов 1024. Ответов 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
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,529
Записей в блоге: 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 / 1914 / 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
5153 / 3465 / 536
Регистрация: 01.06.2013
Сообщений: 7,529
Записей в блоге: 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 / 1914 / 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru