Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Структура функций
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Страницы: 1, 2
pokk
Здравствуйте, есть вот такая хитрая структура (тут мне не совсем понятно что делает union и зачем он там нужен)
CODE

typedef struct __WIZCHIP
{
uint16_t if_mode; ///< host interface mode
uint8_t id[6]; ///< @b WIZCHIP ID such as @b 5100, @b 5200, @b 5500, and so on.
/**
* The set of critical section callback func.
*/
struct _CRIS
{
void (*_enter) (void); ///< crtical section enter
void (*_exit) (void); ///< critial section exit
}CRIS;
/**
* The set of @ref\_WIZCHIP_ select control callback func.
*/
struct _CS
{
void (*_select) (void); ///< @ref \_WIZCHIP_ selected
void (*_deselect)(void); ///< @ref \_WIZCHIP_ deselected
}CS;
/**
* The set of interface IO callback func.
*/
union _IF
{
/**
* For BUS interface IO
*/
struct
{
uint8_t (*_read_byte) (uint32_t AddrSel);
void (*_write_byte) (uint32_t AddrSel, uint8_t wb);
}BUS;
/**
* For SPI interface IO
*/
struct
{
uint8_t (*_read_byte) (void);
void (*_write_byte) (uint8_t wb);
}SPI;
// To be added
//
}IF;
}_WIZCHIP;

Заполнение её (.if_mode .id и др указывают место расположение ? т.е при таком подходе можно их местами менять ? )
Код
_WIZCHIP  WIZCHIP =
      {
      .id                  = _WIZCHIP_ID_,
      .if_mode             = _WIZCHIP_IO_MODE_,
      .CRIS._enter         = wizchip_cris_enter,
      .CRIS._exit          = wizchip_cris_exit,
      .CS._select          = wizchip_cs_select,
      .CS._deselect        = wizchip_cs_deselect,
      .IF.BUS._read_byte   = wizchip_bus_readbyte,
      .IF.BUS._write_byte  = wizchip_bus_writebyte
//    .IF.SPI._read_byte   = wizchip_spi_readbyte,
//    .IF.SPI._write_byte  = wizchip_spi_writebyte
      };

Работа с ней выглядит так
Код
WIZCHIP.CS._select();


т.е получается просто вызывается функция wizchip_cs_select()

Так вот чём преимущество такого подхода WIZCHIP.CS._select(); по сравнению с просто вызовом функции wizchip_cs_select(); ?
И на сколько дольше выполняется первый метод по сравнению со вторым?


smalcom
>> т.е при таком подходе можно их местами менять ? )
да

>> Так вот чём преимущество такого подхода WIZCHIP.CS._select();
объектно ориентированный дизайн. возможность подмены низкого уровня(драйверов) не изменяя верхний(API т.с.).

>> И на сколько дольше выполняется первый метод по сравнению со вторым?
в теории на время загрузки индексного регистра. на практике компилятор может и подставить значение. собрать и посмотреть дизасм.
_Pasha
Цитата(pokk @ Feb 14 2014, 04:34) *
Так вот чём преимущество такого подхода WIZCHIP.CS._select(); по сравнению с просто вызовом функции wizchip_cs_select(); ?

Код с етим WIZCHIP не зависит от конкретной платы. А это даёт такой профит: например, его можно собрать в либу и больше не тратить времени на перекомпиляцию. Разумеется, в мелких проектах сие значения не имеет, но правильность подхода придает уверенность, что оно может работать и в составе более сложных систем без изменений. Удачная декомпозиция на независимые модули никогда не останется лишним капризом - рано или поздно себя проявит.


Цитата
И на сколько дольше выполняется первый метод по сравнению со вторым?

если вызываемая функция в том же модуле и описана как static - то ни насколько.
AlexandrY
Цитата(pokk @ Feb 14 2014, 02:34) *
т.е получается просто вызывается функция wizchip_cs_select()

Так вот чём преимущество такого подхода WIZCHIP.CS._select(); по сравнению с просто вызовом функции wizchip_cs_select(); ?
И на сколько дольше выполняется первый метод по сравнению со вторым?


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

А я например такому коду сразу делаю беспощадный рефакторинг.
pokk
Спасибо за помощь. Я примерно так и думал только где-то там в комментариях увидел про ОС. Думал что-то с ней может быть связанно.
Цитата
Удачная декомпозиция на независимые модули никогда не останется лишним капризом - рано или поздно себя проявит.

Это точно сейчас вот с этим воюю, так как изначально чёрти что понаделал.
ar__systems
Цитата(_Pasha @ Feb 14 2014, 08:57) *
Код с етим WIZCHIP не зависит от конкретной платы. А это даёт такой профит: например, его можно собрать в либу и больше не тратить времени на перекомпиляцию. Разумеется, в мелких проектах сие значения не имеет, но правильность подхода придает уверенность, что оно может работать и в составе более сложных систем без изменений. Удачная декомпозиция на независимые модули никогда не останется лишним капризом - рано или поздно себя проявит.



если вызываемая функция в том же модуле и описана как static - то ни насколько.


Все это можно было бы достичь и без таких извращений. Виртуальные функции на С, это все-таки ужасный изврат.

Какая связь между независимыми модулями, и этим кодом?
ViKo
Что такое callback функция? И в Википедии читал, и все равно не понимаю. Функция, вызываемая по указателю на нее? Функция, вызывающая функцию, указатель на которую передан в параметрах? Кто бы определил ясно и четко. Вижу, этим термином злоупотребляют, где ни попадя.
В чем преимущество по сравнению с "функцией, вызываемой из функции"?
aaarrr
Цитата(ViKo @ May 3 2014, 13:31) *
Что такое callback функция?

Это функция, вызываемая по событию. Способ вызова значения не имеет.
ViKo
Цитата(aaarrr @ May 3 2014, 12:54) *
Это функция, вызываемая по событию. Способ вызова значения не имеет.

http://ru.wikipedia.org/wiki/Callback_(%D0...BD%D0%B8%D0%B5)
Тут трошачки не так написано. Ваше определение - как частный случай.
aaarrr
"передача исполняемого кода в качестве одного из параметров другого кода"
Да уж, отличное определение. Исполняемый код обычно никуда не передается, "параметр кода" - это тоже что-то заоблачное.

Хорошо, напишем так: это функция, вызываемая по событию, и заранее не определенная для вызывающего её (условно "библиотечного") кода.
doom13
Цитата(ViKo @ May 3 2014, 12:31) *
Что такое callback функция? И в Википедии читал, и все равно не понимаю. Функция, вызываемая по указателю на нее? Функция, вызывающая функцию, указатель на которую передан в параметрах? Кто бы определил ясно и четко. Вижу, этим термином злоупотребляют, где ни попадя.
В чем преимущество по сравнению с "функцией, вызываемой из функции"?


Недавно читал доку wifi_stack_api_reference_v0.8.pdf и там прикольное определение было:

"Callback programming is a style of computer programming, which allows lower layer of software to call functions defined on a higher layer. Callback is piece of code or a reference to a piece of code that is passed as an argument."

Там же ссылка.

"Сallback function is a function that is called through a function pointer. If you pass the pointer (address) of a function as an argument to another, when that pointer is used to call the function it points to it is said that a call back is made."
Lagman
Callback функции часто встречаются в API библиотеках инициализации и конфигурирования микроконтроллера и его периферии, для указания вызова функции (callback) из прерывания (чаще всего), например настраивается (инициализируется) условие внешнего прерывания IO pin и тут же указывается callback, при этом программист даже не задумывается по какому вектору будет происходить вызов функции обработки прерывания, из которой уже будет произведен запуск callback.
ViKo
Цитата(aaarrr @ May 3 2014, 13:29) *
Хорошо, напишем так: это функция, вызываемая по событию, и заранее не определенная для вызывающего её (условно "библиотечного") кода.

В том и дело, что по Википедии получается, не обязательно по событию, а просто в качестве параметра функции. Или это принципиальное свойство?
aaarrr
Цитата(ViKo @ May 3 2014, 14:50) *
В том и дело, что по Википедии получается, не обязательно по событию, а просто в качестве параметра функции. Или это принципиальное свойство?

Ну, любая функция так или иначе вызывается по событию sm.gif
Принципиальное свойство - параметризуемость вызываемого объекта (не обязательно передача именно как параметра функции, т.к. это может быть отдельная структура и т.п).

Вещь простая, но дать краткое и исчерпывающее определение, не опускаясь при этом в частности, трудно.
A. Fig Lee
Цитата(ViKo @ May 3 2014, 05:50) *
В том и дело, что по Википедии получается, не обязательно по событию, а просто в качестве параметра функции. Или это принципиальное свойство?

Не знаю то там в википедии, но смысл именно чтобы по какомуто событию передать данные обратно.
Асинхронно! Именно это и имеют ввиду "callback". Когда он "обратно позвонит" неизвестно.
Ждать нам некогда. Поэтому вот финкция и "будут деньги - звони, а мне некогда"
ViKo
Цитата(A. Fig Lee @ May 3 2014, 22:47) *
Не знаю то там в википедии, но смысл именно чтобы по какомуто событию передать данные обратно.
Асинхронно! Именно это и имеют ввиду "callback". Когда он "обратно позвонит" неизвестно.
Ждать нам некогда. Поэтому вот финкция и "будут деньги - звони, а мне некогда"

Обратно - это куда? "Сигнал посылаем - вы что это там? А нас посылают обратно!"
Можете привести пример менее аб... абстрактный?
A. Fig Lee
Цитата(ViKo @ May 3 2014, 17:01) *
Обратно - это куда? "Сигнал посылаем - вы что это там? А нас посылают обратно!"
Можете привести пример менее аб... абстрактный?

Привожу. Посылаю CAN message. Записать я его по SPI записал.
Теперь когда результат доставки будет - неизвестно, а мне надо еще посылать.
Передаю "позывные" своего message и говорю: свиснешь как доставишь - получилось, нет..
И передаю следующий в буффер..
Вот когда будет результат доставки, CAN вызовет callback (позовет меня обратно) и скажет смог или нет
ViKo
Handshake? По-моему, вы спекулянт (понятиями).
AHTOXA
По-моему, callback - это просто.
Например, есть функция вывода jpg-картинки на экран. Она умеет декодировать картинку. Но не знает, как отрисовать пиксель на экране. Мы вызываем её, и в качестве параметра передаём указатель на функцию отрисовки пикселя.
Такой подход позволяет уменьшить связность программ.
Можно не передавать функцию в качестве параметра при вызове каждый раз, а передать её один раз при инициализации библиотеки.
Функция может выполняться в отдельном потоке. Тогда она будет вызывать наш callback асинхронно.
Но это уже частности, суть от этого не меняется.
A. Fig Lee
Цитата(AHTOXA @ May 4 2014, 01:29) *
По-моему, callback - это просто.
Например, есть функция вывода jpg-картинки на экран. Она умеет декодировать картинку. Но не знает, как отрисовать пиксель на экране. Мы вызываем её, и в качестве параметра передаём указатель на функцию отрисовки пикселя.
Такой подход позволяет уменьшить связность программ.
Можно не передавать функцию в качестве параметра при вызове каждый раз, а передать её один раз при инициализации библиотеки.
Функция может выполняться в отдельном потоке. Тогда она будет вызывать наш callback асинхронно.
Но это уже частности, суть от этого не меняется.

нет, это не callback. Это аналог виртуальной функции в C++, которая может быть подменена на ходу.
Callback всегда асинхронен. И всегда по какому то событию.

Цитата(ViKo @ May 4 2014, 01:13) *
Handshake? По-моему, вы спекулянт (понятиями).

Это абсолютно другое понятие.
AHTOXA
Цитата(A. Fig Lee @ May 4 2014, 19:01) *
нет, это не callback. Это аналог виртуальной функции в C++, которая может быть подменена на ходу.
Callback всегда асинхронен. И всегда по какому то событию.

Вы что-то путаете. callback - это функция обратного вызова. И всё.
A. Fig Lee
Цитата(AHTOXA @ May 4 2014, 08:09) *
Вы что-то путаете. callback - это функция обратного вызова. И всё.

Нет гарантии что каллбэк синхронен. Именно поэтому он так и называется.
"Право на звонок" передается другому треду.
Если функция вызывается из того же треда то это не каллбэк.

Как там экономно такси вызывают? Звонишь на номер и отключаешся.
Ждешь каллбэк. Полная аналогия.
AHTOXA
Цитата(A. Fig Lee @ May 4 2014, 21:10) *
Нет гарантии что каллбэк синхронен. Именно поэтому он так и называется.
"Право на звонок" передается другому треду.
Если функция вызывается из того же треда то это не каллбэк.

Ага. Было "Callback всегда асинхронен", теперь "Нет гарантии что каллбэк синхронен" sm.gif
Жду правильной версии: "Понятие асинхронности ортогонально понятию каллбэк" sm.gif
Суть калбэка - обратный вызов. Почитайте хоть википедию, там куча примеров синхронных каллбэков.
Могу примеры из WinAPI с синхронными каллбэками.
ViKo
Что есть "обратный вызов"? По-моему, это неправильная печать перевод. Можно представить что-то вроде "туда-обратно". Типа, функция, возвращающаяся назад, а не вызывающая другие функции.
A. Fig Lee
Цитата(AHTOXA @ May 4 2014, 11:56) *
Ага. Было "Callback всегда асинхронен", теперь "Нет гарантии что каллбэк синхронен" sm.gif

А это одно и тоже. он асинхроннен, но в теории может совпасть.


Цитата(ViKo @ May 4 2014, 13:19) *
Что есть "обратный вызов"? По-моему, это неправильная печать перевод. Можно представить что-то вроде "туда-обратно". Типа, функция, возвращающаяся назад, а не вызывающая другие функции.

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

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

Нормальный перевод. Мы вызываем библиотечную функцию, она в процессе своей работы вызывает нас обратно, через переданную ей в качестве параметра функцию обратного вызова.

Цитата(A. Fig Lee @ May 5 2014, 00:36) *
А это одно и тоже. он асинхроннен, но в теории может совпасть.

Ну хватит уже нести чушь. Вы неправильно понимаете, что такое callback.
Вот пример синхронного калбэка: EnumWindows
Цитата
BOOL WINAPI EnumWindows(
_In_ WNDENUMPROC lpEnumFunc,
_In_ LPARAM lParam
);

Parameters:
lpEnumFunc [in]
Type: WNDENUMPROC
A pointer to an application-defined callback function. For more information, see EnumWindowsProc.

ViKo
Цитата(AHTOXA @ May 4 2014, 21:43) *
Нормальный перевод. Мы вызываем библиотечную функцию, она в процессе своей работы вызывает нас обратно, через переданную ей в качестве параметра функцию обратного вызова.

По-вашему, получается, callback - это функция, в которую передали другую функцию в качестве параметра. Так прямо "вызывает"? Может, все таки, возвращается? rolleyes.gif
Разве вызываемая функция не вернется в вызывающую (библиотечную, в вашем примере)?
По-моему, callback - это как раз та функция, которую передали.

Функция, возвращающаяся назад...? Так они все назад... sm.gif
Tiro
Цитата(ViKo @ May 4 2014, 21:19) *
Что есть "обратный вызов"? По-моему, это неправильная печать перевод. Можно представить что-то вроде "туда-обратно". Типа, функция, возвращающаяся назад, а не вызывающая другие функции.

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

P.S. И прошу помнить о раздельной компиляции модулей.
ViKo
То есть, события, асинхронность - не при чем? Просто передаем один из возможных методов (функций)? И что же тогда означает "callback"?
Tiro
Цитата(ViKo @ May 4 2014, 22:06) *
То есть, события, асинхронность - не при чем? Просто передаем один из возможных методов (функций)?

Конечно (Только "методы" - это такое ограничение на "функции", которое наложил C++).
Вот у Вас есть программно-аппаратный модуль, который программирует таймер, обрабатывает от него прерывания. Он все знает о таймере. Вы его запрограммируете и все. А как узнать, что время, которое Вы заказали, прошло? Надо передать адрес подпрограммы, которая будет вызвана по истечении времени. Это как раз простейший пример "callback" подпрограммы.

P.S. В данном контексте подпрограмма для "обратной связи" модулей.
ViKo
Цитата(Tiro @ May 4 2014, 22:10) *
Вот у Вас есть программно-аппаратный модуль, который программирует таймер, обрабатывает от него прерывания. Он все знает о таймере. Вы его запрограммируете и все. А как узнать, что время, которое Вы заказали, прошло? Надо передать адрес подпрограммы, которая будет вызвана по истечении времени. Это как раз простейший пример "callback" подпрограммы.

P.S. В данном контексте подпрограмма для "обратной связи".

Возникло прерывание (событие). Обработчик вызвал некую функцию (она callback?).
Все, doom13 дал ссылку. Собственно, я так и думал. 08.gif
Tiro
Цитата(ViKo @ May 4 2014, 22:17) *
Возникло прерывание (событие). Обработчик вызвал некую функцию (она callback?).

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

Не при каждом аппаратном событии модуля А произойдет callback модуля В. Callback модуля В = событие модуля В.

Для модуля С все тоже самое. Рекурсивно. sm.gif
AHTOXA
Цитата(ViKo @ May 5 2014, 00:55) *
По-вашему, получается, callback - это функция, в которую передали другую функцию в качестве параметра. Так прямо "вызывает"? Может, все таки, возвращается? rolleyes.gif
Разве вызываемая функция не вернется в вызывающую (библиотечную, в вашем примере)?
По-моему, callback - это как раз та функция, которую передали.

Функция, возвращающаяся назад...? Так они все назад... sm.gif


Уф... %)

Я не понимаю, что вам не понятно. Давайте прямо на примере этой самой функции EnumWindows. Ваша программа хочет получить список всех окон в системе и поэтому вызывает функцию EnumWindows(). Функция EnumWindows() умеет находить все окна в системе. Но что с ними делать дальше, она понятия не имеет. Это знаете вы - вы хотите напечатать названия этих окон. Поэтому вы создаёте специальную функцию - функцию обратного вызова (callback) PrintWindow(), которая печатает название окна, которое передано ей. И передаёте функцию PrintWindow() в качестве параметра при вызове EnumWindows(). Ваша функция PrintWindow() - это как раз и есть callback.
Теперь функция EnumWindows() для каждого найденного окна вызовет этот callback. Потом она завершит свою работу, и вернёт управление вашей программе.

То есть, у вас в программе есть функция main(), и есть функция PrintWindow(). Вы вызываете из main() библиотечную функцию EnumWindows(PrintWindow). Тогда контроль в вашей программе будет передаваться так:
main() - EnumWindows() - PrintWindow() - PrintWindow() - PrintWindow() - PrintWindow()- ... - main().

Что касаемо названия "callback". Вызов из пользовательской программы библиотечной функции - это нормальный вызов. Вызов наоборот - из библиотечной функции пользовательской функции - обратный вызов. Всё логичноsm.gif
A. Fig Lee
Цитата(AHTOXA @ May 4 2014, 13:43) *
Ну хватит уже нести чушь. Вы неправильно понимаете, что такое callback.
Вот пример синхронного калбэка: EnumWindows

Callback ВСЕГДА асинхронный, строго говоря. и в этом случае тоже.
Смысл в том, что мы передаем другой программе/объекту/кернелу/треду "управление".
Что оно будет делать и когда нас позовет неизвестно.
И EnumWindows не исключение.
Другой вопрос, что вернется функция после вызова каллбэка.
Но это чисто применение синхронизейшн примитивов.
Точно так же можно позвать функцию передачи данных в сериал порт, передать туда каллбэк функцию,
котораю будет сигналить объект, а мы после вызова нашей функции будем ждать этот обьект.
И абсолютно асинхронный каллбэк "вдруг стал синхронным".

На самом деле в обоих случаях сам каллбэк был асинхронным. Иначе это уже не будет то, что называют каллбэком


Цитата(ViKo @ May 4 2014, 14:06) *
То есть, события, асинхронность - не при чем? Просто передаем один из возможных методов (функций)? И что же тогда означает "callback"?

Именно асинхронность и события причем.

Вот я, например, написал библиотеку для связи через ethernet.
Периодически она будет передавать данные из сети пользователю.
Когда - неизвестно.
Как пользователю получить данные?
Типичное применение - при инициализации моей библиотеки он передает мне callback функцию,
которую я буду звать, когда чтото прийдет.


Цитата(AHTOXA @ May 4 2014, 14:48) *
Что касаемо названия "callback". Вызов из пользовательской программы библиотечной функции - это нормальный вызов. Вызов наоборот - из библиотечной функции пользовательской функции - обратный вызов. Всё логичноsm.gif

Необязательно. Не всякая функция, которую вызывают через пойнтер, является каллбэком
AHTOXA
Цитата(A. Fig Lee @ May 5 2014, 05:54) *
Callback ВСЕГДА асинхронный, строго говоря. и в этом случае тоже.

Неверно. Асинхронный - это кода управление вернулось после вызова, а вызовы callback-а продолжают поступать.
В данном случае callback именно синхронный. Точно так же, как и в примере с сортировкой qsort.
Ещё раз повторяю: callback и асинхронность - вещи ортогональные.
XVR
2 ТС - вы смешали в одну кучу назначение callback'ов, их реализацию и смысл самого понятия callback. Все 3 части могут иметь разные реализации и/или толкования, и не надо их путать sm.gif
ViKo
Цитата(XVR @ May 5 2014, 14:38) *
2 ТС - вы смешали в одну кучу назначение callback'ов, их реализацию и смысл самого понятия callback. Все 3 части могут иметь разные реализации и/или толкования, и не надо их путать sm.gif

Вообще-то, это не ТС смешал. rolleyes.gif Там уже все закончилось. Я набрел на тему поиском по слову callback. Думал, могу получить короткий точный ответ.
А вы своим сообщением путаницы добавили. sm.gif Дайте уж и свое толкование всех частей.
A. Fig Lee
Цитата(AHTOXA @ May 5 2014, 00:26) *
Неверно. Асинхронный - это кода управление вернулось после вызова, а вызовы callback-а продолжают поступать.
В данном случае callback именно синхронный. Точно так же, как и в примере с сортировкой qsort.
Ещё раз повторяю: callback и асинхронность - вещи ортогональные.

Нет. Он синхронный только потому что его принудительно синхронизировали.
Такими вещами как WaitForSingleObject.
То, что вы этого не видите, ничего не значит. Любой каллбэк можно засинхронизировать по отношению
к вызывающей функции.
Но он как был по сути асинхронным, так как мы не имеем никакого контроля над самим каллбэком, так и остался.
XVR
Цитата(ViKo @ May 5 2014, 16:12) *
Дайте уж и свое толкование всех частей.
Их уже давали тут, но все в куче rolleyes.gif
Если хотите, то вот -

Понятие callback'а - дословно 'обратный вызов'. Точнее это оповещение о каком то событии, которое (оповещение) передает тот, у кого это событие произошло, тому, кто этот самый callback установил. В установке callback'а обязательно присутствуют 2 стороны - одна предоставляет сам callback, вторая его активирует в соответствующий момент.

Назначение callback'а - может быть самое разное. Это может быть сигнализация о наступлении аппаратного прерывания, сигнализация о срабатывании программного события (WaitForSingleObject), доставка пользовательского event'а (в различных оконных системах), наступление каких то программно/аппаратных событий (исчерпании кольцевого DMA буфера например)

Реализация callback'а - указатель на функцию callback'а, переданный в виде параметра в вызов интерфейсной процедуры. Тот же самый указатель, помещенный в какой то структуре в памяти. Виртуальные функции в С++. Примитив ОС (HANDLE от CreateEvent).
ViKo
Из словаря. Не обязательно обратный вызов.
XVR
Если из 'словаря', то это вариант 'д' wink.gif Давайте споры о точности перевода оставим для форума лингвистов sm.gif

A. Fig Lee
Цитата(ViKo @ May 5 2014, 08:56) *
Из словаря. Не обязательно обратный вызов.

"Перезванивать кому либо". Это и есть. Перезвонить вызывающему.
AHTOXA
Цитата(A. Fig Lee @ May 5 2014, 18:45) *
Нет. Он синхронный только потому что его принудительно синхронизировали.
Такими вещами как WaitForSingleObject.
То, что вы этого не видите, ничего не значит. Любой каллбэк можно засинхронизировать по отношению
к вызывающей функции.

Если его засинхронизировали, то он синхронный. Если он синхронный, то он совершенно точно не асинхронный. По-моему, это очевидно.

ЗЫ. Задание на дом - поищите скрытую асинхронность (такие вещи как WaitForSingleObject) в реализации callback-ов в функции qsort() например.
ViKo
Цитата(XVR @ May 5 2014, 17:14) *
Если из 'словаря', то это вариант 'д' wink.gif Давайте споры о точности перевода оставим для форума лингвистов sm.gif

А мне понятнее вариант 'в'. Вызвали callback функцию, и она вернула, то, чего нам не хватало. laughing.gif
А синхронизации - не вижу. Для этого есть другие элементы. Семафоры, например.
amaora
Цитата(aaarrr @ May 3 2014, 14:29) *
Хорошо, напишем так: это функция, вызываемая по событию, и заранее не определенная для вызывающего её (условно "библиотечного") кода.


А это как называется? Или где здесь событие?

Код
void fooInit(struct foo *x, void * (*dmalloc) (size_t sz))
{
  lowInit(x->ba1);
  ...
  x->dma1 = dmalloc(1024 * x->szE);
  x->dma2 = dmalloc(1024 * x->szE);
  ...
  irqEnable(x->irqN);
}

...
fooInit(&ifc1, dmalloc_seg1);
fooInit(&ifc2, dmalloc_seg2);




Попытаюсь дать свое опрделение callback функции. Начать надо с того, что подразумевается разделение кода на некие уровни, слои абстракции. Каждый слой может использовать только более нижние слои для реализации своих функций. Каждый такой вызов это прямой вызов callforward. Если где-то надо вызвать код более высого слоя, то это обратный вызов callback. Самый известный пример, доставка событий. А самая известная реализация в C языках это указатель на функцию.
GetSmart
Цитата(AHTOXA @ May 5 2014, 01:48) *
Что касаемо названия "callback". Вызов из пользовательской программы библиотечной функции - это нормальный вызов. Вызов наоборот - из библиотечной функции пользовательской функции - обратный вызов. Всё логичноsm.gif

А что логичного в вводе лишней сущности на 100% аналогичной параметру-функции? Её частный случай - виртуальная/перегруженная функция (объекта). Их все тоже колбэками обзывать?

ИМХО A. Fig Lee указал на ключевой признак - вызов из другого треда.
A. Fig Lee
Цитата(AHTOXA @ May 5 2014, 11:58) *
Если его засинхронизировали, то он синхронный. Если он синхронный, то он совершенно точно не асинхронный. По-моему, это очевидно.

Именно. Что сам по себе он всегда асинхронный. Чтоб был синхронным надо пляски с бубном.
Пляски с бубном прямого отношения к каллбэку не имеют, но имеют к тому что он асинхронный.
Приходится синхронизировать.

А так да, можно все что угодно засинхронизировать.


Цитата(amaora @ May 5 2014, 13:22) *
А это как называется? Или где здесь событие?

Нет никакого каллбэка здесь. Вызов функции через пойнтер есть.
Абстракция есть. Виртуальная функция средствами С, так сказать.
ViKo
Цитата(amaora @ May 5 2014, 21:22) *
Если где-то надо вызвать код более высого слоя, то это обратный вызов callback. Самый известный пример, доставка событий. А самая известная реализация в C языках это указатель на функцию.

А если указатель указывает на функцию более низкого уровня, тогда как? И по какому критерию делить на уровни?
AHTOXA
Цитата(GetSmart @ May 6 2014, 01:22) *
А что логичного в вводе лишней сущности на 100% аналогичной параметру-функции? Её частный случай - виртуальная/перегруженная функция (объекта). Их все тоже колбэками обзывать?

Это не просто параметр-функция. Это такой параметр-функция, который вызывается в процессе работы вызываемой функции (той, которой мы передали параметр). Я уже приводил пример простейшего callback-а: параметр compare функции qsort(). Функция qsort() умеет быстро сортировать, но не знает, что она сортирует. Поэтому она вызывает пользовательскую функцию сравнения. Вот это и есть callback в чистом виде.

Цитата(GetSmart @ May 6 2014, 01:22) *
ИМХО A. Fig Lee указал на ключевой признак - вызов из другого треда.

Нет, это совершенно не обязательно.
ViKo
Цитата(AHTOXA @ May 5 2014, 23:24) *
Это такой параметр-функция, который вызывается в процессе работы вызываемой функции (той, которой мы передали параметр).

А разве может быть иное?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.