КИТА unofficial
Апрель 27, 2024, 08:39:59 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   ПРАВИЛА Помощь WIKI PDA Войти Регистрация  


Страниц: [1]   Вниз
  Печать  
Автор Тема: "Системное программирование" (задача 2)  (Прочитано 11700 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« : Февраль 26, 2007, 11:11:40 »

Что такое сallback в программировании?
Ответить необходимо так, чтобы даже первокурснику было ясно.
Если можно, то с маленьким примером. с очень маленьким.
« Последнее редактирование: Февраль 27, 2007, 06:31:48 от vimmax » Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #1 : Февраль 26, 2007, 12:39:42 »

Callback-функции - это так называемые функции обратного вызова.

Современные приложения как правило имеют многослойную архитектуру. В такой архитектуре имеется некоторое ядро с базовыми сервисами и внешние слои. Причем внешние слои могут разрабатываться позже ядра и соответственно ядро может(и не должно!) знать особенностей внешних слоев.

Если из внешнего слоя необходимо вызвать некоторую функцию ядра, то как правило в этом нет трудностей(при наличии знаний и некривых рук конечно Улыбка ). В то же время вызов функции внешнего слоя из ядра не столь тривиален, поскольку ядро ничего не знает о функциях и сервисах внешних слоев. Для решения этой задачи и придумали callback-функции.

Принцип примерно такой: ядро определяет заголовок и параметры, которые должна иметь callback-функция, а внешний слой описывает некоторую функцию с указанными параметрами, после чего некоторым образом сообщает ядру о том, что описанная функция - это callback-функция. В зависимости от ОС или технологий программирования существуют специальные механизмы, обеспечивающие вызов таких callback-функций из ядра.

С помощью такого механизма сервисы уровня ядра могут вызывать сервисы внешних слоев. Это обеспечивает расширение функциональности без изменения ядра системы.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #2 : Февраль 26, 2007, 01:07:58 »

Sochin - Ответ #1 - надо попроще, цитата слишком сложная. Далеко не каждый первокурсник поймет это определение, а ведь даже на первом курсе по программированию студенты пишут программы используя callback, только они об этом не знают ))))))).

Еще есть варианты? Больше никто не хочет попытаться ответить?
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #3 : Февраль 26, 2007, 01:09:21 »

гы-гы. куда уж проще? ))
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
BODROV
Mодератор
Доцент
*****

Карма: +37/-1
Offline 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.

отсюда blush
Записан
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline 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 Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #6 : Февраль 26, 2007, 01:55:13 »

BODROV - Ответ #4 - тоже слишком сложный ответ + ответ ориентирован на WinAPI и тяжело понять, что же все-таки делает callback и можно ли его выполнить при создании консольного приложения.
Sochin - Ответ #5 - я в шоке !!!

Механизм Callback гораздо проще. Попробуйте написать своими словами.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #7 : Февраль 26, 2007, 02:34:22 »

ответ ориентирован на WinAPI и тяжело понять, что же все-таки делает callback и можно ли его выполнить при создании консольного приложения.

См. ответ №1: общее описание техники, без привязки к ОС/технологии/типу приложения.

Цитировать
Sochin - Ответ #5 - я в шоке !!!

Хотел же проще! )))

Цитировать
Механизм Callback гораздо проще. Попробуйте написать своими словами.

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

1) например callback-функция сравнения объектов в алгоритме сортировки.
2) алгоритм сортировки в виде callback-функции, в зависимости от алгоритма сортировки, вызываемый из другой функции.

Но этот ответ опять же ориентирован на конкретную реализацию общего принципа callback.
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #8 : Февраль 26, 2007, 02:44:27 »

Sochin - Ответ #7 - отлично!!! а в чем "общий принцип callback" ?
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #9 : Февраль 26, 2007, 03:31:30 »

Sochin - Ответ #7 - отлично!!! а в чем "общий принцип callback" ?

Ну вот в том и принцип - это механизм неявного вызова сервисов внешних уровней из сервисов уровня ядра. )
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline 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 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 Offline

Пол: Мужской
Награды:
лучшая гитара мира
Сообщений: 1713


♪♪ ♫ ♪♪ ♫ ♪♪ ♫ ♪♪


« Ответ #12 : Февраль 26, 2007, 07:19:05 »

А я наоборот, считаю что делегаты и применение WinAPI - это уже надстройки применения callback. Ведь вызов функций по указателю может производится не только из ядра, а и из различных фреймверков, библиотек и просто программных модулей. В каждом из этих случаев приходится иметь дело с указателями на функции, даже если они завуалированы в делегаты.
Записан

♪♪ ♫  LET FOREVER BE  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #13 : Февраль 26, 2007, 07:23:40 »

Дело в том, что в .Net ты в принципе не работаешь с указателями. А принцип обратных вызовов расширен. Улыбка

Это все равно, что сказать - "да ваще никакова коллбэка нету, ведь все равно рано или поздно все проги в машинные коды переводятся, а значит есть просто регистры процессора и операнды, даже если они завуалированы в типы данных, адреса, функции, объекты, делегаты, библиотеки, драйверы..." Улыбка))
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
Sochin
Злой модератор
Декан
*****

Карма: +108/-6
Offline Offline

Пол: Мужской
Сообщений: 1518



« Ответ #14 : Февраль 26, 2007, 07:25:29 »

Кстати, под ядром и внешними слоями я не подразумевал однозначно ядро ОС и приложения. Это может быть и и центральный модуль программы, библиотеки, собственного фреймворка. )
Записан

Говорят, когда компьютер сгорает, перед взором микропроцессора за долю секунды проносятся все операции, которые он когда-либо совершил...
壯鎭
vimmax
Модератор
Декан
*****

Карма: +42/-3
Offline 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  ♫ ♪♪ ♫ ♪♪ ♪♪ ♫
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Penguins Counter Powered by MySQL Powered by PHP Powered by SMF 1.1.8 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS! Internetmap
Страница сгенерирована за 0.1 секунд. Запросов: 30.