Я не хочу что-то вроде:
#define some_func(a) some_func(a, create_foo())
и затем при использовании:
void loop() {
some_func(3);
some_func(40);
}
экземпляр Foo
должен создаваться только один раз для каждой строки.
Так и в приведенном выше случае 2 раза. И когда цикл снова запускается, он не должен снова создавать экземпляры Foo
.
Возможна ли такая вещь?
Вот полная нерабочая программа:
Выход должен быть 3, 40, 6, 80, 9, 120, 12, 160, ...
typedef struct {
int a;
} Foo;
Foo create_foo() {
return {0};
}
void some_func(int a, Foo &f) {
f.a += a;
Serial.println(f.a);
}
#define some_func(a) some_func(a, create_foo())
void setup() {
Serial.begin(9600);
}
void loop() {
some_func(3); // 3, 6, 9, 12
some_func(40); // 40, 80, 120, 160
}
Edit.
Я пытался свести пример к минимуму, но сейчас я стреляю себе в ногу. На самом деле, у меня нет void
в качестве возвращаемого типа, но boolean
.
Итак, я попробую что-то вроде этого:
#define debounce(val) for(static auto d = create_debounce(); debounce(d, val), false;)
Но это, конечно, не помогает при использовании с:
int state = debounce(digitalRead(BUTTON_FIRE));
Причина, по которой макрос не возвращает значение, поэтому присвоение невозможно.
Так что мне нужно что-то вроде:
#define debounce(val) true; for(static auto d = create_debounce(); debounce(d, val), false;)
где true
- результат функции create_debounce
.
Так может отравить это еще больше, чтобы сделать это возможным? Вот полный код:
// ----------------- L I B R A R Y . S T U F F -------------------------
#define debounce_delay 50
typedef struct {
int state;
int last_state;
unsigned long last_state_change_time;
} Debounce;
Debounce create_debounce() {
return {0, 0, 0L};
}
boolean debounce(Debounce &deb, int val) {
if (val != deb.last_state) {
deb.last_state_change_time = millis();
deb.last_state = val;
}
else if ((millis() - deb.last_state_change_time) > debounce_delay) {
deb.state = val;
}
return deb.state;
}
//#define debounce(val) for(static auto d = create_debounce(); debounce(d, val), false;)
#define debounce(val) true; for(static auto d = create_debounce(); debounce(d, val), false;)
// ----------------- S K E T C H -------------------------
#define BUTTON_FIRE 7
void setup() {
Serial.begin(9600);
}
void loop() {
int state = debounce(digitalRead(BUTTON_FIRE));
if (state == HIGH) {
Serial.println("HIGH");
}
else {
Serial.println("LOW");
}
}