);
typedef void ( *pvMBFrameStop ) ( void );
typedef eMBErrorCode( *peMBFrameReceive ) ( UCHAR * pucRcvAddress,
UCHAR ** pucFrame,
USHORT * pusLength );
typedef eMBErrorCode( *peMBFrameSend ) ( UCHAR slaveAddress,
const UCHAR * pucFrame,
USHORT usLength );
typedef void( *pvMBFrameClose ) ( void );
я же правильно понимаю, что это указатели на ф-и которые будут вызывать вместо функций, которые им присвоили?
Прототипы.
да, это описывают прототипы функций. Если ты обьявишь функции с таким типом и присвоишь указателю или сделаешь массив с ними. С можешь вызывать их
https://metanit.com/cpp/c/5.11.php
я как понял это указатель на ф-ю
да я смотрю как сделан freemodbus, чтоб свой протокол наковырякать
ну вот использую эти прототипы как тип, ты можешь в структуре объявить поле типа handler и ему присвоить
Стоп, Леонид не послал курить базовый функционал С. Это просто день хороший, или ему, как почтальону Печкину, велосипед подарили?)
это частный случай
ребенок спал хорошо 😀. ДА и вопрос адекватный, я скинул пример с описанием
значит надо пользоваться по максимуму) Про колбэки еще вопрос будет, а то видел, знаю, применял, но далеко не уходил
Вообще дико полезный функционал. В ядре линухи повсеместно используется.
я понимаю, что грубо говоря это как флаг, выставился и сработало нет флага - не сработало Можно лишних флагов не городить
Не совсем так. Ты можешь на одно и то же событие назначать разные обработчики. Ну и да, проверку на NULL никто не отменял)
то что функция себя на ноль не поделила (условно)
не-а, не так. Флаг ты для пролверки проверяешь и переходишь куда тебе нужно
а колбэк обратный вызов же
Пример функция сорт
молодец! Возьми пирожок с полки, протри и положи обратно :)
я просто разницу не понимаю между ними в каком-то плане, отличие между ними то какое. Функционал для меня похож
Что указатель на хэндлер не присвоен. Т.е. переходить некуда.
ты перевел дословно. Но по своей сути - это указатель, которому присваивают указатель на функцию и по наступлению события внутри кода происходит что то типа pointer_to_func(); если есть параметры - внутрь они передаются
То же самое, что функцию дернуть внутри кода, хотя дублирование кода будет, а здесь функция как параметр
ты внутрь можешь передать функцию или на лету поменять на нужную тебе. Или обработчики команд делать хорошо. Вот пришел тебе код 1 ты взял из массива указателей на функцию элемент 1 - выполнил. Пришел 5 - выполнил. И нет никаких свитчкейсов и код проще и приятнее
Дублирование будет только в случае с inline функцией.
какое дублирование кода. Ты о чем?
Пан не путает ли с инлайн? Леонид не понял о каком дублировании кода идет речь
Вай, да, чушь написал.
Не буду больше писать в чат, пока в код смотрю, чревато)
ну я в том плане, что fo1(symma,2,3) fo1 ((int (*op)(int, int),a,b) { return op(a,b); } fo2(a,b) { return symma(a,b); } symma(int a,int b) { return a+b }
чет наркоманией попахивает, если честно
Колбэки нужны же чтоб упростить некоторые функеции и не делать дублирование кода?
Коллбэки нужны, чтобы делать динамическое присваивание обработчиков
надо найти себе пример разжеванный а то неполное понимание
Обработчик прерывания в хал
Если в 2х словах : у тебя где то определена функция foo, пусть это выглядит как uint16_t foo(uint8_t a, uint8_t b) { return a+b; } это значит что код этой функции помещается где то в памяти, а переменная foo хранит АДРЕС, где этот код лежит, и когда ты где то в коде пишешь foo(3,4); то в стек помещаются параметры 3 и 4 и далее идет ПЕРЕХОД к исполнению кода по адресу, находящемуся в переменной foo далее уже код функции foo извлекает переданные ей параметры из стека, производит над ними операцию сложения, результат помещает обратно в стек и делает ОБРАТНЫЙ переход к месту, откуда она была вызвана.
Не всегда на стек. Зависит от соглашения вызовов. В арме например первые четыре будут а регистрах при вызове. Если их ширина до 32 бит. Или первые два, если пот64 бита... Вообщем есть штука как соглашение о вызовах, полезно почитать чтобы понимать что под капотом делается и чего не стоит делать Хотя бы это. https://en.m.wikipedia.org/wiki/Calling_convention Но я бы рекомендовал полностью его прочесть
это да, но поэтому я и написал "в двух словах". Потом уже в процессе углубления человек уже почитает про соглашение о вызовах)
Обсуждают сегодня