2017-02-17 98 views
0

我正在使用esp8266制作一个简单的自制软件IoT解决方案,使用库中的内部版本构建Web服务器路由。这些lib函数不喜欢使用带参数的函数,所以我的解决方案是使用lambdas并捕获我需要的变量。问题是当试图在两个不同lambda表达式的同一个对象实例上进行操作时,使用pinPower setter方法更新一个存储引脚功率的int(1或0,是的,我知道bool会更好)一个lambda不会出现在另一个中。对多个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变量是无效的时间server.on调用你的lambda。我的猜测是在server.on调用它的时候(是异步调用吗?)变量超出了范围。 – obamator

+0

谢谢,我将该数组声明为全局变量,并且它工作正常。尽管如此,我感到有些尴尬,但是还是谢谢。太糟糕了,我不能将评论标记为答案! – SteinFlugel

0

失败对我而言,数组出去的范围,而途径则该esp8266webserver对象是全局声明。通过@obamator帮助解决问题