2017-02-17 2 views
0

Я делаю простое домашнее решение IoT с использованием esp8266, используя сборку библиотек для маршрутов веб-сервера. Эти функции lib не любят использовать функции с аргументами, поэтому мое решение заключалось в использовании lambdas и захвате переменных, которые мне нужны. Проблема в том, что при попытке работать с одним экземпляром объекта из двух разных lambdas при использовании методов set pinPower, которые обновляют int, сохраняя мощность вывода (1 или 0, да, я знаю, что bool будет лучше), изменение в одна лямбда не появляется в другой.Работа с объектами, захваченными в нескольких lambdas

Я думаю, что это связано с тем, что lambdas захватывает переменные по значению и создает новый экземпляр моего класса; Я попытался захватить outputPinArray [i] в ​​качестве ссылки, но это просто означало, что функция getter не получила правильное значение и поэтому не смогла сделать так много, как переключить значение (класс использует getter внутри). Использование статической переменной и функции getter, но я хочу, чтобы иметь возможность использовать несколько экземпляров класса, и поэтому не нужно использовать общую переменную. Я видел различные сообщения вокруг, которые, похоже, указывают на захват с использованием ключевого слова extern, но я не нашел много документации для использования этого в lambdas и не смог понять, как правильно его использовать.

Это код, я работаю с:

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); 
} 

Любая помощь приветствуется, спасибо!

+2

Вам следует попытаться опубликовать наименьшее количество кода, необходимого для демонстрации вашего вопроса. [mcve] Когда вы публикуете стену с текстом и стенкой кода, вы ограничиваете число желающих попробовать и помогать. – xaxxon

ответ

0

Если я правильно понимаю вашу проблему правильно, все, что вам нужно сделать, это

server.on(path, HTTP_POST, [&outputPinArray , argToCheck, i]() { 
+0

Я уже пробовал это, и это делает мои методы getter бесполезными, возвращая 0 или некоторое число, например 1075863164. – SteinFlugel

+1

@SteinFlugel - это проблема, которую вам нужно выяснить. Похоже, ваша переменная outputPinArray недействительна сервером time.on вызывает вашу лямбду. Мое предположение было бы к серверу времени. Называет это (это асинхронный вызов?), Переменная выходит за рамки. – obamator

+0

Спасибо, я объявил массив как глобальный var, и он сработал. Это было немного неловко с моей стороны, но, тем не менее, спасибо. Жаль, что я не могу отметить комментарий в качестве ответа! – SteinFlugel

0

фаил с моей стороны, массив вышел из области видимости, маршруты были объект esp8266webserver был объявлен во всем мире. Решено с помощью @obamator

Смежные вопросы