Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Структура функций
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
GetSmart
Цитата(AHTOXA @ May 6 2014, 02:24) *
Это не просто параметр-функция. Это такой параметр-функция, который вызывается в процессе работы вызываемой функции (той, которой мы передали параметр). Я уже приводил пример простейшего callback-а: ...

Неубедительно.
Параметр-функция для того и существует, чтобы его/её вызывать "оттуда". И как раз функция, которая будет вызывать другую функцию через параметр не знает о ней ничего, кроме списка передаваемых ей параметров. Хотя, из другого треда это уже динамически настраеваемый адрес event-а.

Всё-таки где отличия от параметра-функции или это 100% аналог?
AHTOXA
Цитата(ViKo @ May 6 2014, 02:31) *
А разве может быть иное?

Да. Функция может не вызывать переданный ей параметр-функцию в процессе своей работыsm.gif
Может просто сохранить в переменной, например. Или возвращать адрес функции-параметра.

Цитата(GetSmart @ May 6 2014, 02:37) *
Неубедительно.

Вы не согласны с тем, что параметр функции qsort() является callback-ом? Так это не я придумал, это общепринято.
То, что вы с A. Fig Lee считаете callback'ом - это асинхронный callback, частный случай callback'а. Вот вам, например, статья про сравнение асинхронных и синхронных callback'ов. Там есть и определения для этих двух вариантов.

Цитата(GetSmart @ May 6 2014, 02:37) *
Всё-таки где отличия от параметра-функции или это 100% аналог?

Вот выше я привёл два примера функции-параметра, не являющихся callback'ами. Но обычно эти понятия синонимы.
A. Fig Lee
Цитата(AHTOXA @ May 5 2014, 16:59) *
Вы не согласны с тем, что параметр функции qsort() является callback-ом? Так это не я придумал, это общепринято.

CC2520 не является Zigbee трансивером, но в мануале она так обзывается.
Если нет факта callbacka, значит это не callback.
qsort, это ни какой ни бэк, это последовательная енумерация.
Без всяких коллов и бэков.
XVR
Цитата(ViKo @ May 5 2014, 22:00) *
А мне понятнее вариант 'в'. Вызвали callback функцию, и она вернула, то, чего нам не хватало. laughing.gif
callback может ничего не возвращать
Цитата
А синхронизации - не вижу. Для этого есть другие элементы. Семафоры, например.
Одно другому не мешает. И синхронизировать можно через вызов функции callback'а, и сам семафор использовать в качестве callback'а (callback - это не обязательно функция sm.gif )
amaora
Цитата(ViKo @ May 5 2014, 23:48) *
А если указатель указывает на функцию более низкого уровня, тогда как? И по какому критерию делить на уровни?

Тогда это прямой вызов. По указателю или нет, значения не имеет. Как делить на уровни решает тот кто пишет код. Файловая система например обычно на уровень выше драйвера устройства хранения.
GetSmart
Цитата(A. Fig Lee @ May 6 2014, 04:48) *
Если нет факта callbacka, значит это не callback.

Голосуем. Кто за этот вариант? sm.gif
А то чёткость признаков отсутствует.

Цитата(amaora @ May 7 2014, 11:21) *
Файловая система например обычно на уровень выше драйвера устройства хранения.

Драйвер устройства хранения вызывает функции файловой системы?
AHTOXA
Цитата(GetSmart @ May 7 2014, 16:53) *
Голосуем. Кто за этот вариант? sm.gif

Да, это стопудово верный вариант. Осталось выяснить, что такое факты callback'а sm.gif
GetSmart
Цитата(AHTOXA @ May 7 2014, 17:40) *
Да, это стопудово верный вариант. Осталось выяснить, что такое факты callback'а sm.gif

Как в жизни. "Перезвони(те) мне" = асинхронность + разговор за чужой счёт (чужой тред). Плюс нет 100% гарантии, что перезвонит sm.gif
A. Fig Lee
Цитата(GetSmart @ May 7 2014, 05:53) *
Голосуем. Кто за этот вариант? sm.gif

+1.
Кстати по поводу "qsort callback"
Это как "шампанское" "Советское шампанское".
Все называют. Хотя правильное определение шампанского, если спросить:
игристое вино произведенное в провинции Шампань.
А так да, шампанское является игристым вином..

GetSmart
Цитата(A. Fig Lee @ May 7 2014, 19:30) *
Все называют. Хотя правильное определение шампанского, если спросить:
игристое вино произведенное в провинции Шампань.

Это уже ниже пояса (про советское). Напиток давно потерял связь с деревней.

Более интересен вопрос: Корневой класс колбэкает виртуальные методы своих потомков или нет? Они ей вроде как сообщают "номера телефонов". Но здесь скорее кол без бэка.
amaora
Цитата(GetSmart @ May 7 2014, 14:53) *
Драйвер устройства хранения вызывает функции файловой системы?

Если да, то это будет callback. Даже если функция вызывается по статическому адресу. Или если вызывается синхронно, например fopen->fs_open_xxx->drv_read_blk->fs_alloc_blk. Главное, что вызов направлен в обратную строну, назад.
AHTOXA
Цитата(GetSmart @ May 7 2014, 19:17) *
Как в жизни. "Перезвони(те) мне" = асинхронность + разговор за чужой счёт (чужой тред). Плюс нет 100% гарантии, что перезвонит sm.gif

Понятие асинхронности не связано с понятием обратного вызова. Обратный вызов - это просто направление.

Мне не нравится аналогия с телефоном, но если уж её применять, то это будет выглядеть так:
  • Вы звоните оператору сортировки (qsort company), и делаете заказ - отсортировать список гостей на свадьбу.
  • При этом вы сообщаете ему номер жены для консультаций о порядке сортировки (compare). Трубку не кладёте, ждёте результата.
  • Оператор в процессе сортировки перезванивает вашей жене другому номеру (compare) и уточняет (кого с кем посадить).
  • По окончании сортировки оператор сообщает вам результат.

Это получается синхронный callback. То же самое, но вы кладёте трубку после заказа, а оператор перезванивает вам после выполнения - асинхронный.

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

Цитата(A. Fig Lee @ May 7 2014, 19:30) *
Кстати по поводу "qsort callback"
Это как "шампанское" "Советское шампанское".
Все называют. Хотя правильное определение шампанского, если спросить:


Не болтайте ерундой. Это именно callback. Такова устоявшаяся терминология в данной отрасли (программирование).
ViKo
Цитата(AHTOXA @ May 7 2014, 21:28) *
Это получается синхронный callback. То же самое, но вы кладёте трубку после заказа, а оператор перезванивает вам после выполнения - асинхронный.

Переведите это на язык программы. Что значит "не кладете трубку" и что "кладете"? Из основной функции вызвали функцию сортировки (а она уже там колбэк), и уже никто ничего не ждет. rolleyes.gif Сортировка отработает и вернется туда, откуда вызвали. Разница может быть в том, что сортировка вернет некий код, в зависимости от которого будут выполняться следующие действия, или не вернет ничего. Так?
AHTOXA
Цитата(ViKo @ May 8 2014, 00:37) *
Переведите это на язык программы. Что значит "не кладете трубку" и что "кладете"?

Очень просто. Если "не кладёте трубку" - все вызовы колбэков идут _до_ возврата из функции сортировки. Если "кладёте" - вызовы могут идти после возврата из функции сортировки.
То есть, мы из main() вызвали qsort(), qsort в процессе работы много раз вызвал compare(), отсортировал, и только после этого вернул управление в main(). Здесь compare - синхронный callback.
Второй вариант. Мы вызвали qsort_async(compare, done). Этот qsort вернул управление сразу, мы можем делать что-то другое. А qsort в это время работает, вызывает compare. Это уже асинхронные обратные вызовы. Ну и когда он отсортирует, он вызовет ф-ю done(). Такой callback называют completion routine.
ViKo
Цитата(AHTOXA @ May 7 2014, 22:16) *
Второй вариант. Мы вызвали qsort_async(compare, done). Этот qsort вернул управление сразу, мы можем делать что-то другое. А qsort в это время работает, вызывает compare. Это уже асинхронные обратные вызовы. Ну и когда он отсортирует, он вызовет ф-ю done(). Такой callback называют completion routine.

Первый вариант - понятно. А второй - предполагает многозадачную или многопроцессорную систему? А, может, пускай они уже сами по себе работают - один проц сортирует, а другой... перемешивает sm.gif ? Ах, да, еще же прерывания есть... w00t.gif
A. Fig Lee
Цитата(AHTOXA @ May 7 2014, 14:16) *
Очень просто. Если "не кладёте трубку" - все вызовы колбэков идут ...

Никуда они не идут. Дозвонится не получится.
Управление надо получить сначала

Цитата(AHTOXA @ May 7 2014, 13:28) *
Не болтайте ерундой. Это именно callback. Такова устоявшаяся терминология в данной отрасли (программирование).


Нет. Не согласен.
GetSmart
Цитата(AHTOXA @ May 8 2014, 00:28) *
Мне не нравится аналогия с телефоном, но если уж её применять, то это будет выглядеть так:
...
Это получается синхронный callback.

"Их" устоявшаяся терминология понятна. Как минимум два типа вызовов, принципиально непохожих. Но зачем-то обозванных одним обобщающим термином. Причём, кто-то и семафоры в эту "кучу" "притягивает" как способ возврата информации.

Из недостатков - синхронный ("за уши притянутый") неотличим от обычной функции-параметра. И не суть важно как иерархически они связаны. Но главный - конфликт синхронного с общепринятым в обиходе смыслом слова колбэк/перезвон. В жизни переадресацию перезвоном никто не называет из-за мешающего ключевого признака у понятия перезвон.
AHTOXA
Цитата(ViKo @ May 8 2014, 02:11) *
Первый вариант - понятно. А второй - предполагает многозадачную или многопроцессорную систему?

Да, естественно. Асинхронность подразумевает несколько потоков выполнения.

Цитата(GetSmart @ May 8 2014, 08:40) *
"Их" устоявшаяся терминология понятна. Как минимум два типа вызовов, принципиально непохожих. Но зачем-то обозванных одним обобщающим термином. Причём, кто-то и семафоры в эту "кучу" "притягивает" как способ возврата информации.

Термин в принципе тоже понятен - обратный вызов из библиотеки. Вас постоянно сбивает аналогия с телефоном. Но между телефонным обратным вызовом и обратным вызовом функции есть принципиальная разница: телефонный обратный вызов обычно производится по тому же самому телефону, который инициировал вызов. В случае же с вызовом функции - вызывается другая функция, не та, что инициировала весь этот процесс. Поэтому представить синхронный колбэк по телефону сложнее (приходится приплетать женуsm.gif ).
dxp
QUOTE (AHTOXA @ May 8 2014, 01:28) *
Понятие асинхронности не связано с понятием обратного вызова. Обратный вызов - это просто направление.

Мне не нравится аналогия с телефоном, но если уж её применять, то это будет выглядеть так:
  • Вы звоните оператору сортировки (qsort company), и делаете заказ - отсортировать список гостей на свадьбу.
  • При этом вы сообщаете ему номер жены для консультаций о порядке сортировки (compare). Трубку не кладёте, ждёте результата.
  • Оператор в процессе сортировки перезванивает вашей жене другому номеру (compare) и уточняет (кого с кем посадить).
  • По окончании сортировки оператор сообщает вам результат.

Это получается синхронный callback. То же самое, но вы кладёте трубку после заказа, а оператор перезванивает вам после выполнения - асинхронный.

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



Не болтайте ерундой. Это именно callback. Такова устоявшаяся терминология в данной отрасли (программирование).

Всё верно, ни убавить, ни добавить. За пример с телефоном и сортировкой отдельный респект. sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.