У меня есть PIC18F46K22 и я программирую его с помощью компилятора XC8. В конце концов, у меня будет система вроде ПК с stdin
и stdout
. Таким образом, в главном цикле будет функция, которая проверяет, есть ли новый ввод. Если есть ввод, функция будет вызываться соответственно. Так, например , когда я ввод Л на stdin
, ПИК будет работать как функцию function_A
вместо того , function_B
который вызывается , когда я ввод в B.
Когда PIC сделан с функцией, я хочу, чтобы новый вход был отправлен в функцию. Таким образом, при нажатии A открывается передатчик RS232, с этого момента каждый вход будет отправляться через RS232. В итоге проект представляет собой самостоятельный текстовый редактор. Таким образом, при нажатии A открывается файловая система, с этого момента вы больше не редактируете текст, а просматриваете список файлов. Это означает, что нажатие клавиш «Вверх» и «Вниз» означает нечто иное, чем в среде редактирования текста.
Я много думал о том, как запрограммировать это на C. Я думал об этом вчера вечером и хотел бы знать, возможно ли это, и если да, то как. Что я хочу сделать, это:
main
Функция вызывает функцию какfunction_A
function_A
изменяет глобальную переменнуюfunction_addr
на адресный указатель функцииin_function_A
- С этого момента
main
вызывается функцияfunction_addr
при появлении нового ввода.
Так что мне нужна main
функция, которая проверяет, function_addr
равен ли ноль. Если это так, должна вызываться «нормальная» функция, например function_A
. Если это не так, function_addr
должна вызываться функция at . Мне также нужно, function_A
который меняет function_addr
указатель на in_function_A
.
Примечание: когда функция файловой системы должна быть закрыта, is_function_A
следует просто изменить function_addr
на 0.
Так что в основном мой вопрос, как я могу
- Получить адрес функции (и сохранить его в переменной)
- Вызов функции по указанному адресу
Ответы:
Функция
Получить адрес функции (и сохранить его в переменной)
Вызов функции по указанному адресу
источник
fp(12)
не повышает читаемость(*fp)(12)
. У них разная читаемость.(*fp)(12)
напоминает читателю, чтоfp
является указателем, а также напоминает объявлениеfp
. На мой взгляд, этот стиль связан со старыми источниками, такими как внутренние компоненты X11 и K & R C. Одна из возможных причин, по которой он может быть связан с K & R C, заключается в том, что в ANSI C можно объявитьfp
с использованием синтаксиса функции, еслиfp
это параметр:int func(int fp(double)) {}
, В K & R C это было быint func(fp) int (*fp)(double); { ... }
.Хотя ответ Ваутерса абсолютно верный, это может быть более дружественным для новичка и лучшим примером относительно вашего вопроса.
Если не очевидно, что указателю функции действительно назначен адрес целевой функции, целесообразно выполнить проверку NULL.
источник
fp
занимает, изначально равно NULL. Я бы сделалint (*fp)(int) = NULL;
как объединенную декларацию и инициализацию, чтобы быть уверенным - вы не хотите переходить к какой-то случайной ячейке памяти из-за некоторого тупого значения, которое только что произошло. Затем просто назначьте,fp
как в вашейExample()
функции.fp
это «глобальная переменная» (как в коде выше), то она гарантированно будет инициализированаNULL
(без необходимости явно).