vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« : Февраль 26, 2007, 11:11:40 » |
|
Что такое сallback в программировании? Ответить необходимо так, чтобы даже первокурснику было ясно. Если можно, то с маленьким примером. с очень маленьким.
|
|
« Последнее редактирование: Февраль 27, 2007, 06:31:48 от vimmax »
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #1 : Февраль 26, 2007, 12:39:42 » |
|
Callback-функции - это так называемые функции обратного вызова. Современные приложения как правило имеют многослойную архитектуру. В такой архитектуре имеется некоторое ядро с базовыми сервисами и внешние слои. Причем внешние слои могут разрабатываться позже ядра и соответственно ядро может(и не должно!) знать особенностей внешних слоев. Если из внешнего слоя необходимо вызвать некоторую функцию ядра, то как правило в этом нет трудностей(при наличии знаний и некривых рук конечно ). В то же время вызов функции внешнего слоя из ядра не столь тривиален, поскольку ядро ничего не знает о функциях и сервисах внешних слоев. Для решения этой задачи и придумали callback-функции. Принцип примерно такой: ядро определяет заголовок и параметры, которые должна иметь callback-функция, а внешний слой описывает некоторую функцию с указанными параметрами, после чего некоторым образом сообщает ядру о том, что описанная функция - это callback-функция. В зависимости от ОС или технологий программирования существуют специальные механизмы, обеспечивающие вызов таких callback-функций из ядра. С помощью такого механизма сервисы уровня ядра могут вызывать сервисы внешних слоев. Это обеспечивает расширение функциональности без изменения ядра системы.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #2 : Февраль 26, 2007, 01:07:58 » |
|
Sochin - Ответ #1 - надо попроще, цитата слишком сложная. Далеко не каждый первокурсник поймет это определение, а ведь даже на первом курсе по программированию студенты пишут программы используя callback, только они об этом не знают ))))))).
Еще есть варианты? Больше никто не хочет попытаться ответить?
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #3 : Февраль 26, 2007, 01:09:21 » |
|
гы-гы. куда уж проще? ))
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
BODROV
Mодератор
Доцент
Карма: +37/-1
Offline
Пол:
Сообщений: 550
хде я?
|
|
« Ответ #4 : Февраль 26, 2007, 01:18:30 » |
|
Обычно такие функции называются функциями обратного вызова. Это просто. Если Вашу функцию должен вызывать Windows, то вы должны указать ей тип передачи параметров как CALLBACK. Этот тип вызова описан в WinDef.H как:
#define CALLBACK __stdcall
То есть тип передачи параметров PASCAL. Обычный вызов функций осуществляется в стиле WIN32 API. Как же Windows узнает, что эту функцию можно выполнить ? Вы сами, зная то или нет, передаете ее в параметрах. Если вы создаете окно в Win 32, то и передаете функцию окна. Windows эту функцию вызывает когда управляет окном. Все просто. Сказали системе, что если нужно обратиться к окну вот тебе функция. После этого Windows знает, что если нужно перерисовать окно, то он хвать эту функцию и передает ей в параметры WM_PAINT. Идея довольно простая. Операционная система должна уметь вызывать некоторые функции в приложении, чтобы освободить вас как программиста от слежения за программой. Кто писал для ДОС знает как это не удобно думать о том, какое окно видно на экране, а какое нет. Пусть операционная система заботится. Итак, в любой программе для Windows (кстати и не только в понимании графического интерфейса) есть функции, которые вызовет операционная система. Как пример главная функция окна. Эта функция должна быть в программе правильно оформлена, а именно CALLBACK. Обычно мы ее передаем в виде параметров при вызове фнукций WIN32 API. отсюда
|
|
|
Записан
|
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #5 : Февраль 26, 2007, 01:42:18 » |
|
Sochin - Ответ #1 - надо попроще, цитата слишком сложная.
гы-гы. куда уж проще? ))
Если нынче студенты первого курса технического университета не поймут пояснения выше, то вот вариант для первого класса начальной школы с практическим примером: У Маши есть 5 яблок. Но Маша не знает что с ними делать. Зато что с ними делать знает Коля и знает Петя. Коля очень любит яблоки есть. А Петя яблоки не ест, он их продает по спекулятивным ценам. Маша говорит ребятам: "Коля и Петя, у меня есть яблоки, давайте что-нибудь с ними сделаем!". На это Коля говорит: "Давайте сьедим их!". А Петя отвечает: "Давайте лучше их толканем и бабла поднимем!". Маша говорит: "Но я не люблю яблоки, а продавать не умею! Что же делать?". После недолгих раздумий ребята решили сделать так: Маша отдает ребятам по одному яблоку, а ребята уже что-то делают с ними. Итак, Маша отдает Коле два яблока, а Пете три яблока. Коля яблоки грызет, Петя продает на рынке. Итак, дети, в этом случае Маша объявляет формат callback-функции ProcessApples(TApple apple). А ребята предлагают варианты callback-функций: Коля функцию для съедения яблока - EatApple(TApple apple), а Петя для продажи яблока на рынке - SellApple(TApple apple). Вот такой вот удобный способ для того чтобы что-то с яблоками делать и называется callback-функции.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #6 : Февраль 26, 2007, 01:55:13 » |
|
BODROV - Ответ #4 - тоже слишком сложный ответ + ответ ориентирован на WinAPI и тяжело понять, что же все-таки делает callback и можно ли его выполнить при создании консольного приложения. Sochin - Ответ #5 - я в шоке !!!
Механизм Callback гораздо проще. Попробуйте написать своими словами.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #7 : Февраль 26, 2007, 02:34:22 » |
|
ответ ориентирован на WinAPI и тяжело понять, что же все-таки делает callback и можно ли его выполнить при создании консольного приложения. См. ответ №1: общее описание техники, без привязки к ОС/технологии/типу приложения. Sochin - Ответ #5 - я в шоке !!!
Хотел же проще! ))) Механизм Callback гораздо проще. Попробуйте написать своими словами.
Как пример можно привести паскалевский тип данных-функция. Когда пишутся несколько функций с одинаковыми сигнатурами и по очереди вызываются через переменную типа-функция в некотором обобщенном алгоритме. 1) например callback-функция сравнения объектов в алгоритме сортировки. 2) алгоритм сортировки в виде callback-функции, в зависимости от алгоритма сортировки, вызываемый из другой функции. Но этот ответ опять же ориентирован на конкретную реализацию общего принципа callback.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #8 : Февраль 26, 2007, 02:44:27 » |
|
Sochin - Ответ #7 - отлично!!! а в чем "общий принцип callback" ?
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #9 : Февраль 26, 2007, 03:31:30 » |
|
Sochin - Ответ #7 - отлично!!! а в чем "общий принцип callback" ?
Ну вот в том и принцип - это механизм неявного вызова сервисов внешних уровней из сервисов уровня ядра. )
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #10 : Февраль 26, 2007, 06:12:34 » |
|
Sochin - Ответ #7 - ответ правильный +1. Фактически все ответы правильные. Только я хотел услышать что-то типа:
Callback функции - это когда функция funcА вызывает другую функцию funcВ, переданную в funcА в качестве параметра. Соответственно функция funcВ - есть callback-функция.
Суть этого приема в том, что можно написать свою функцию funcUser, передать указатель на нее в функцию funcA. А функция funcA вызовет любую функцию, которую ей передадут в качестве параметра, подходящую по шаблону.
Попозже выложу маленький пример программки.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #11 : Февраль 26, 2007, 06:52:02 » |
|
Callback функции - это когда функция funcА вызывает другую функцию funcВ, переданную в funcА в качестве параметра. Соответственно функция funcВ - есть callback-функция.
Суть этого приема в том, что можно написать свою функцию funcUser, передать указатель на нее в функцию funcA. А функция funcA вызовет любую функцию, которую ей передадут в качестве параметра, подходящую по шаблону.
Случай с функциями - частный случай принципа обратных вызовов. Callback-функция в твоем примере - это простой указатель. В мире .Net есть такое понятие как делегат. Делегат - это ОО-аналог указателя на функцию для callback-вызовов. Т.е. это уже не указатель на функцию, это полноценный объект! Более того, делегаты в .Net имеют возможность содержать указатели сразу на несколько методов, т.е. один callback-вызов может вызвать сразу несколько обработчиков! Так что, формулировка механизм неявного вызова сервисов внешних уровней из сервисов уровня ядра. ) мне представляется более общей чем просто указатель на функцию.
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #12 : Февраль 26, 2007, 07:19:05 » |
|
А я наоборот, считаю что делегаты и применение WinAPI - это уже надстройки применения callback. Ведь вызов функций по указателю может производится не только из ядра, а и из различных фреймверков, библиотек и просто программных модулей. В каждом из этих случаев приходится иметь дело с указателями на функции, даже если они завуалированы в делегаты.
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #13 : Февраль 26, 2007, 07:23:40 » |
|
Дело в том, что в .Net ты в принципе не работаешь с указателями. А принцип обратных вызовов расширен. Это все равно, что сказать - "да ваще никакова коллбэка нету, ведь все равно рано или поздно все проги в машинные коды переводятся, а значит есть просто регистры процессора и операнды, даже если они завуалированы в типы данных, адреса, функции, объекты, делегаты, библиотеки, драйверы..." ))
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
Sochin
Злой модератор
Декан
Карма: +108/-6
Offline
Пол:
Сообщений: 1518
|
|
« Ответ #14 : Февраль 26, 2007, 07:25:29 » |
|
Кстати, под ядром и внешними слоями я не подразумевал однозначно ядро ОС и приложения. Это может быть и и центральный модуль программы, библиотеки, собственного фреймворка. )
|
|
|
Записан
|
Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил... 壯鎭
|
|
|
vimmax
Модератор
Декан
Карма: +42/-3
Offline
Пол: Награды:
Сообщений: 1713
♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪
|
|
« Ответ #15 : Март 02, 2007, 05:18:49 » |
|
Обещанный пример по теме топика: #include <iostream.h> //-------------------------------------------- // Указатель на функцию typedef void (*MYCALLBACKFUNC)(void); //-------------------------------------------- // Callback-функция void FuncB(void) { cout<<"Call of FuncB function"<<endl; } //-------------------------------------------- // Функция, организующая callback-вызов void FuncA (MYCALLBACKFUNC MyFuncPtr) { MyFuncPtr(); } //-------------------------------------------- // Основная программа int main(int argc, char* argv[]) { FuncA(FuncB); return 0; } //--------------------------------------------
|
|
|
Записан
|
♪♪ ♫ LET FOREVER BE ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
|
|
|
|