КИТА unofficial

Ваши интересы => Викторины и конкурсы => Тема начата: vimmax от Февраль 26, 2007, 11:11:40



Название: "Системное программирование" (задача 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 как:

#define CALLBACK    __stdcall

То есть тип передачи параметров PASCAL. Обычный вызов функций осуществляется в стиле WIN32 API. Как же Windows узнает, что эту функцию можно выполнить ? Вы сами, зная то или нет, передаете ее в параметрах. Если вы создаете окно в Win 32, то и передаете функцию окна. Windows эту функцию вызывает когда управляет окном. Все просто. Сказали системе, что если нужно обратиться к окну вот тебе функция. После этого Windows знает, что если нужно перерисовать окно, то он хвать эту функцию и передает ей в параметры WM_PAINT. Идея довольно простая. Операционная система должна уметь вызывать некоторые функции в приложении, чтобы освободить вас как программиста от слежения за программой. Кто писал для ДОС знает как это не удобно думать о том, какое окно видно на экране, а какое нет. Пусть операционная система заботится. Итак, в любой программе для Windows (кстати и не только в понимании графического интерфейса) есть функции, которые вызовет операционная система. Как пример главная функция окна. Эта функция должна быть в программе правильно оформлена, а именно CALLBACK. Обычно мы ее передаем в виде параметров при вызове фнукций WIN32 API.
отсюда (http://firststeps.ru/mfc/winapi/r.php?55) :blush:


Название: 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;
}
//--------------------------------------------