Недопустимое использование выражения 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. Как бы я это сделал?

, 👍0


2 ответа


Лучший ответ:

1

attachInterrupt ожидает, что простой указатель на функцию не принимает аргументов и ничего не возвращает (void).

Так что на самом деле нет никакого способа напрямую сделать то, о чем вы говорите. Там нет встроенной способности каррировать. Вы можете определить свои собственные функции, такие как

void proxy_changedirection_1() {
    changedirection(1);
}

А затем attachInterrupt с указанием proxy_changedirection_1, или вы можете использовать лямбду без захватов для той же цели:

attachInterrupt(
    digitalPinToInterrupt(stallsense1),
    [] () {
        changedirection(1);
    },
    RISING
);
,

Большое вам спасибо. Лямбда-нотация ближе к тому, что я предполагал получить от python., @Jules


0

Случилось так, что вы написали выражение void, в котором ожидалось выражение типа "указатель на функцию void, возвращающую void" (т. Е. Без аргументов и возвращаемого значения). Имя функции без круглых скобок для списка аргументов-это выражение типа "указатель на функцию", принимающее любые аргументы и типы, для которых была объявлена именованная функция, и возвращающее любой тип, для которого была объявлена именованная функция.

Но если вы напишете с ним круглые скобки, то теперь вы написали выражение, которое 1) было бы (если бы оно было действительным) оценено во время вызова attachInterrupt() - гораздо раньше, чем вы хотите! - и верните значение этого возвращаемого типа, а не того, который вы ожидали.

@timemage предложил два способа решить эту проблему.

,