Недопустимое использование выражения void (как использовать указатель функции с вводом)
Я определяю attachinterrupt и сталкиваюсь с ошибкой. Линия, о которой идет речь, такова:
void setup() {
attachInterrupt(digitalPinToInterrupt(stallsense1), changedirection(1), RISING);
attachInterrupt(digitalPinToInterrupt(stallsense2), changedirection(2), RISING);
}
и ошибка, которую я получаю, такова:
error: invalid use of void expression
attachInterrupt(digitalPinToInterrupt(stallsense2), changedirection(2), RISING);
^
exit status 1
invalid use of void expression
Идея в том, что у меня есть одна функция changedirection и два возможных входа, 1 или 2. Я считаю, что проблема в том, что я вызвал функцию changedirection(1). Я хочу просто сказать attachinterrupt вызвать функцию changedirection с вводом 1 или 2. Как бы я это сделал?
@Jules, 👍0
2 ответа
Лучший ответ:
attachInterrupt
ожидает, что простой указатель на функцию не принимает аргументов и ничего не возвращает (void).
Так что на самом деле нет никакого способа напрямую сделать то, о чем вы говорите. Там нет встроенной способности каррировать. Вы можете определить свои собственные функции, такие как
void proxy_changedirection_1() {
changedirection(1);
}
А затем attachInterrupt
с указанием proxy_changedirection_1
, или вы можете использовать лямбду без захватов для той же цели:
attachInterrupt(
digitalPinToInterrupt(stallsense1),
[] () {
changedirection(1);
},
RISING
);
Случилось так, что вы написали выражение void, в котором ожидалось выражение типа "указатель на функцию void, возвращающую void" (т. Е. Без аргументов и возвращаемого значения). Имя функции без круглых скобок для списка аргументов-это выражение типа "указатель на функцию", принимающее любые аргументы и типы, для которых была объявлена именованная функция, и возвращающее любой тип, для которого была объявлена именованная функция.
Но если вы напишете с ним круглые скобки, то теперь вы написали выражение, которое 1) было бы (если бы оно было действительным) оценено во время вызова attachInterrupt() - гораздо раньше, чем вы хотите! - и верните значение этого возвращаемого типа, а не того, который вы ожидали.
@timemage предложил два способа решить эту проблему.
- Чтение квадратурного энкодера в реальном времени с полным разрешением только с одним прерыванием на ATmega328
- Проблема прерываний с датчиком потока
- Значение понижающего резистора для прерываний
- Прерывания таймера Arduino для PID
- Правильное использование SPI с ISR
- Контакты внешнего прерывания на наноклонах
- Работа двигателя в течение 3 секунд непрерывно с прерыванием и без него
- Проблема с прескалером таймера Elegoo Nano
Большое вам спасибо. Лямбда-нотация ближе к тому, что я предполагал получить от python., @Jules