Я делаю простое домашнее IoT-решение, используя esp8266, используя встроенные библиотеки для маршрутов веб-сервера. Этим функциям lib не нравится использование функций с аргументами, поэтому я решил использовать лямбда-выражения и захватывать нужные мне переменные. Проблема заключается в том, что при попытке оперировать одним и тем же экземпляром объекта из двух разных лямбд, при использовании методов установки pinPower, которые обновляют int, хранящий мощность булавки (1 или 0, да, я знаю, что bool будет лучше), изменение одна лямбда не появляется в другой.
Я думаю, что это связано с лямбдами, которые захватывают переменные по значению и создают новый экземпляр моего класса; Я попытался захватить outputPinArray [i] в качестве ссылки, но это просто означало, что функция getter не смогла получить правильное значение и поэтому не смогла сделать так много, как переключение значения (класс использует getter внутри). Использование статической переменной и функции getter работало, но я хочу иметь возможность использовать несколько экземпляров класса и поэтому не хочу использовать разделяемую переменную, подобную этой. Я видел различные посты вокруг, которые, кажется, указывают на захват с помощью ключевого слова extern, но я не нашел много документации для использования этого в лямбдах и не смог понять, как правильно его использовать.
Это код, с которым я работаю:
for(int i = 0; i < 1; i++) {
server.on(path, HTTP_POST, [outputPinArray , argToCheck, i]() mutable {
// Sets pinNumber variable and turns on or off the arduino pin using outputPinArray[i].setPinPower or .togglePinPower
});server.on(path, HTTP_GET, [outputPinArray,i](){
// Send integer value using outputPinArray[i].getPinPower()
});
}
Код класса outputPin:
int OutputPin::getPinPower(){
return pinPower;
}
void OutputPin::setPinPower(int value){
if(value == HIGH || value == LOW){
pinPower = value;
digitalWrite(getPinNum(), pinPower);
}
Любая помощь приветствуется, спасибо!
Если я правильно понимаю вашу проблему, все, что вам нужно сделать, это
server.on(path, HTTP_POST, [&outputPinArray , argToCheck, i]() {
С моей стороны, массив вышел из области видимости, в то время как маршруты были объектом esp8266webserver, который был объявлен глобально. Решено с помощью @obamator