Полная версия этой страницы:
Указатель на функцию
При переносе кода виртуального порта (USB-COM) от ST, столкнулся с такой конструкцией:
uint8_t *(*CopyRoutine)(uint16_t);
Немного пришлось скорректировать код, поскольку у меня проект на С++, NULL заменил на 0. В принципе все работает. Но так толком и не смог назвать CopyRoutine, ну если бы не было левой звездочки, был бы указатель на функцию, а так пока не встречал в своей практике такую конструкцию. Вообщем как ”оно”(CopyRoutine) называется?
Вырезка и листинга:
RESULT Virtual_Com_Port_Data_Setup(uint8_t RequestNo)
{
uint8_t *(*CopyRoutine)(uint16_t);
CopyRoutine = NULL;
……..
NULL определен так:
#define NULL ((void *)0)
IgorKossak
May 30 2011, 06:40
Цитата(Danis @ May 30 2011, 09:35)

как ”оно”(CopyRoutine) называется?
Оно называется указателем на функцию, плучающую uint16_t и возвращающую указатель на uint8_t.
PS
Вынес из темы об STM32.
Danis, уж не для того ли Вы создавали тему в шапке раздела ARM, чтобы валить туда всё подряд? (можно не отвечать)
Цитата(Danis @ May 30 2011, 10:35)

ну если бы не было левой звездочки, был бы указатель на функцию, а так пока не встречал в своей практике такую конструкцию.
Левая звёздочка относится к типу возвращаемого значения. Получается указатель на функцию, возвращающую указатель на uint8_t.
Цитата(IgorKossak @ May 30 2011, 09:40)

Оно называется указателем на функцию, плучающую uint16_t и возвращающую указатель на uint8_t.
Точно, точно. По детски лопухнулся, спасибо!
С замечанием согласен.
demiurg_spb
May 30 2011, 07:53
чтобы не морочить голову я использую typedef, чего и Вам желаю.
Код
typedef uint8_t* (*copy_func_t)(uint16_t); // объявление типа указатель на функцию
...
чтобы не морочить голову ни себе и ни людям, typedef не использую и тебе не советую
http://lxr.linux.no/#linux+v2.6.39/Documen...odingStyle#L277
demiurg_spb
Jun 1 2011, 04:45
Это очень индивидуально.
И с данным утверждением (вернее с рекомендацией) можно как соглашаться так и нет.
Лично мне гораздо удобнее и понятнее читать код где присутствует как можно меньше лишных буковок, typedef в этом плане абсолютно безопасен и стандартен.
После продолжительного опыта программирования на объектных языках программирования проникаешься идеологией типов разных сущностный.
И это очень хорошо на мой взгляд. Я действительно при программировании на С придерживаюсь linux-CodingStyle, но не слепо и огульно...
Это сродни подмеченному нами в одном из обсуждений моменту - невозможно научиться грамотно писать на асме не поняв суть процедурного языка программирования.
И тут я хочу провести красной нитью мысль о невозможности хорошо программировать на С не понимая принципов объектно-ориентированного программирования.
И так фактически во всём. Сейчас много псевдо-программистов, которые окромя одной технологии или фреймворка ничего не видели и не знают. И мы с Вами наблюдаем огромное количество кода никакого качества, даже от именитых вендеров. К чему это я всё? Да к тому что нужно своей головой больше думать и не принимать за чистую монету всё то новое, что увидел, узнал или прочитал.
Здравствуйте!
Хочу оживить дискуссию.
Подскажите как это в теории называется !!!
typedef void QEMUResetHandler(void *opaque);
void qemu_register_reset(QEMUResetHandler *func, void *opaque);
void qemu_unregister_reset(QEMUResetHandler *func, void *opaque);
Цитата(demiurg_spb @ Jun 1 2011, 08:45)

И мы с Вами наблюдаем огромное количество кода никакого качества, даже от именитых вендеров. К чему это я всё? Да к тому что нужно своей головой больше думать и не принимать за чистую монету всё то новое, что увидел, узнал или прочитал.

а с моими размышлениями как спорили... ужас!
andrewlekar
Apr 8 2013, 05:00
Цитата
Подскажите как это в теории называется !!!
callback
demiurg_spb
Apr 8 2013, 06:05
Цитата(andrewlekar @ Apr 8 2013, 09:00)

callback
Или по-русски обратный вызов.
Типичное применение - это функция-обработчик некого события на которое нужно как-то реагировать (иногда по-разному).
И, если этот обратный вызов зарегистрирован (указатель отличен от NULL), то он срабатывает иначе игнорируется.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.