Название: "Системное программирование" (задача 2) Отправлено: vimmax от Февраль 26, 2007, 11:11:40 Что такое сallback в программировании?
Ответить необходимо так, чтобы даже первокурснику было ясно. Если можно, то с маленьким примером. с очень маленьким. Название: Re: "Системное программирование" (задача 2) Отправлено: Sochin от Февраль 26, 2007, 12:39:42 Callback-функции - это так называемые функции обратного вызова.
Современные приложения как правило имеют многослойную архитектуру. В такой архитектуре имеется некоторое ядро с базовыми сервисами и внешние слои. Причем внешние слои могут разрабатываться позже ядра и соответственно ядро может(и не должно!) знать особенностей внешних слоев. Если из внешнего слоя необходимо вызвать некоторую функцию ядра, то как правило в этом нет трудностей(при наличии знаний и некривых рук конечно :) ). В то же время вызов функции внешнего слоя из ядра не столь тривиален, поскольку ядро ничего не знает о функциях и сервисах внешних слоев. Для решения этой задачи и придумали callback-функции. Принцип примерно такой: ядро определяет заголовок и параметры, которые должна иметь callback-функция, а внешний слой описывает некоторую функцию с указанными параметрами, после чего некоторым образом сообщает ядру о том, что описанная функция - это callback-функция. В зависимости от ОС или технологий программирования существуют специальные механизмы, обеспечивающие вызов таких callback-функций из ядра. С помощью такого механизма сервисы уровня ядра могут вызывать сервисы внешних слоев. Это обеспечивает расширение функциональности без изменения ядра системы. Название: Re: "Системное программирование" (задача 2) Отправлено: vimmax от Февраль 26, 2007, 01:07:58 Sochin - Ответ #1 - надо попроще, цитата слишком сложная. Далеко не каждый первокурсник поймет это определение, а ведь даже на первом курсе по программированию студенты пишут программы используя callback, только они об этом не знают ))))))).
Еще есть варианты? Больше никто не хочет попытаться ответить? Название: Re: "Системное программирование" (задача 2) Отправлено: Sochin от Февраль 26, 2007, 01:09:21 гы-гы. куда уж проще? ))
Название: Re: "Системное программирование" (задача 2) Отправлено: BODROV от Февраль 26, 2007, 01:18:30 Цитировать Обычно такие функции называются функциями обратного вызова. Это просто. Если Вашу функцию должен вызывать Windows, то вы должны указать ей тип передачи параметров как CALLBACK. Этот тип вызова описан в WinDef.H как: отсюда (http://firststeps.ru/mfc/winapi/r.php?55) :blush:#define CALLBACK __stdcall То есть тип передачи параметров PASCAL. Обычный вызов функций осуществляется в стиле WIN32 API. Как же Windows узнает, что эту функцию можно выполнить ? Вы сами, зная то или нет, передаете ее в параметрах. Если вы создаете окно в Win 32, то и передаете функцию окна. Windows эту функцию вызывает когда управляет окном. Все просто. Сказали системе, что если нужно обратиться к окну вот тебе функция. После этого Windows знает, что если нужно перерисовать окно, то он хвать эту функцию и передает ей в параметры WM_PAINT. Идея довольно простая. Операционная система должна уметь вызывать некоторые функции в приложении, чтобы освободить вас как программиста от слежения за программой. Кто писал для ДОС знает как это не удобно думать о том, какое окно видно на экране, а какое нет. Пусть операционная система заботится. Итак, в любой программе для Windows (кстати и не только в понимании графического интерфейса) есть функции, которые вызовет операционная система. Как пример главная функция окна. Эта функция должна быть в программе правильно оформлена, а именно CALLBACK. Обычно мы ее передаем в виде параметров при вызове фнукций WIN32 API. Название: Re: "Системное программирование" (задача 2) Отправлено: Sochin от Февраль 26, 2007, 01:42:18 Sochin - Ответ #1 - надо попроще, цитата слишком сложная. гы-гы. куда уж проще? )) Если нынче студенты первого курса технического университета не поймут пояснения выше, то вот вариант для первого класса начальной школы с практическим примером: У Маши есть 5 яблок. Но Маша не знает что с ними делать. Зато что с ними делать знает Коля и знает Петя. Коля очень любит яблоки есть. А Петя яблоки не ест, он их продает по спекулятивным ценам. Маша говорит ребятам: "Коля и Петя, у меня есть яблоки, давайте что-нибудь с ними сделаем!". На это Коля говорит: "Давайте сьедим их!". А Петя отвечает: "Давайте лучше их толканем и бабла поднимем!". Маша говорит: "Но я не люблю яблоки, а продавать не умею! Что же делать?". После недолгих раздумий ребята решили сделать так: Маша отдает ребятам по одному яблоку, а ребята уже что-то делают с ними. Итак, Маша отдает Коле два яблока, а Пете три яблока. Коля яблоки грызет, Петя продает на рынке. Итак, дети, в этом случае Маша объявляет формат callback-функции ProcessApples(TApple apple). А ребята предлагают варианты callback-функций: Коля функцию для съедения яблока - EatApple(TApple apple), а Петя для продажи яблока на рынке - SellApple(TApple apple). Вот такой вот удобный способ для того чтобы что-то с яблоками делать и называется callback-функции. Название: Re: "Системное программирование" (задача 2) Отправлено: vimmax от Февраль 26, 2007, 01:55:13 BODROV - Ответ #4 - тоже слишком сложный ответ + ответ ориентирован на WinAPI и тяжело понять, что же все-таки делает callback и можно ли его выполнить при создании консольного приложения.
Sochin - Ответ #5 - я в шоке !!! Механизм Callback гораздо проще. Попробуйте написать своими словами. Название: Re: "Системное программирование" (задача 2) Отправлено: Sochin от Февраль 26, 2007, 02:34:22 ответ ориентирован на WinAPI и тяжело понять, что же все-таки делает callback и можно ли его выполнить при создании консольного приложения. См. ответ №1: общее описание техники, без привязки к ОС/технологии/типу приложения. Цитировать Sochin - Ответ #5 - я в шоке !!! Хотел же проще! ))) Цитировать Механизм Callback гораздо проще. Попробуйте написать своими словами. Как пример можно привести паскалевский тип данных-функция. Когда пишутся несколько функций с одинаковыми сигнатурами и по очереди вызываются через переменную типа-функция в некотором обобщенном алгоритме. 1) например callback-функция сравнения объектов в алгоритме сортировки. 2) алгоритм сортировки в виде callback-функции, в зависимости от алгоритма сортировки, вызываемый из другой функции. Но этот ответ опять же ориентирован на конкретную реализацию общего принципа callback. Название: Re: "Системное программирование" (задача 2) Отправлено: vimmax от Февраль 26, 2007, 02:44:27 Sochin - Ответ #7 - отлично!!! а в чем "общий принцип callback" ?
Название: Re: "Системное программирование" (задача 2) Отправлено: Sochin от Февраль 26, 2007, 03:31:30 Sochin - Ответ #7 - отлично!!! а в чем "общий принцип callback" ? Ну вот в том и принцип - это механизм неявного вызова сервисов внешних уровней из сервисов уровня ядра. ) Название: Re: "Системное программирование" (задача 2) Отправлено: vimmax от Февраль 26, 2007, 06:12:34 Sochin - Ответ #7 - ответ правильный +1. Фактически все ответы правильные. Только я хотел услышать что-то типа:
Callback функции - это когда функция funcА вызывает другую функцию funcВ, переданную в funcА в качестве параметра. Соответственно функция funcВ - есть callback-функция. Суть этого приема в том, что можно написать свою функцию funcUser, передать указатель на нее в функцию funcA. А функция funcA вызовет любую функцию, которую ей передадут в качестве параметра, подходящую по шаблону. Попозже выложу маленький пример программки. Название: Re: "Системное программирование" (задача 2) Отправлено: Sochin от Февраль 26, 2007, 06:52:02 Callback функции - это когда функция funcА вызывает другую функцию funcВ, переданную в funcА в качестве параметра. Соответственно функция funcВ - есть callback-функция. Суть этого приема в том, что можно написать свою функцию funcUser, передать указатель на нее в функцию funcA. А функция funcA вызовет любую функцию, которую ей передадут в качестве параметра, подходящую по шаблону. Случай с функциями - частный случай принципа обратных вызовов. Callback-функция в твоем примере - это простой указатель. В мире .Net есть такое понятие как делегат. Делегат - это ОО-аналог указателя на функцию для callback-вызовов. Т.е. это уже не указатель на функцию, это полноценный объект! Более того, делегаты в .Net имеют возможность содержать указатели сразу на несколько методов, т.е. один callback-вызов может вызвать сразу несколько обработчиков! Так что, формулировка Цитировать механизм неявного вызова сервисов внешних уровней из сервисов уровня ядра. ) мне представляется более общей чем просто указатель на функцию. :)Название: Re: "Системное программирование" (задача 2) Отправлено: vimmax от Февраль 26, 2007, 07:19:05 А я наоборот, считаю что делегаты и применение WinAPI - это уже надстройки применения callback. Ведь вызов функций по указателю может производится не только из ядра, а и из различных фреймверков, библиотек и просто программных модулей. В каждом из этих случаев приходится иметь дело с указателями на функции, даже если они завуалированы в делегаты.
Название: Re: "Системное программирование" (задача 2) Отправлено: Sochin от Февраль 26, 2007, 07:23:40 Дело в том, что в .Net ты в принципе не работаешь с указателями. А принцип обратных вызовов расширен. :)
Это все равно, что сказать - "да ваще никакова коллбэка нету, ведь все равно рано или поздно все проги в машинные коды переводятся, а значит есть просто регистры процессора и операнды, даже если они завуалированы в типы данных, адреса, функции, объекты, делегаты, библиотеки, драйверы..." :))) Название: Re: "Системное программирование" (задача 2) Отправлено: Sochin от Февраль 26, 2007, 07:25:29 Кстати, под ядром и внешними слоями я не подразумевал однозначно ядро ОС и приложения. Это может быть и и центральный модуль программы, библиотеки, собственного фреймворка. )
Название: Re: "Системное программирование" (задача 2) Отправлено: vimmax от Март 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; } //-------------------------------------------- |