C++/Arduino中的第一个项目来自JavaScript背景。我对这段代码有一些问题!我得到了这个错误:
C:\Users\Owner\Documents\Arduino\libraries\Pad\Pad.cpp:48:55: error: invalid use of non-static member function
sensor.begin( 15, 5 ).onChange( change_callback, 3 );以下是cpp:
#include "Pad.h"
#include "Arduino.h"
#include "FastLED.h"
#include "Automaton.h"
extern CRGB leds[64];
Pad::Pad(int val) {
_val = val;
_default = CHSV(random(255), 255, 255);
_cnt = 0;
fade = false;
fade_val = 0;
}
void Pad::change_callback( int idx, int v, int up ) {
Serial.println(v);
fade_val = v;
}
void Pad::color() {
my_leds[0] = CHSV(random(255),255,255);
fade = true;
}
void Pad::init() {
for(int a = 0 ; a < 8 ; a++) {
my_leds[a] = _default;
}
sensor.begin( 15, 5 ).onChange( change_callback, 3 );
}
void Pad::render() {
if(fade) {
int v = map(fade_val, 0, 1023, 0, 255);
my_leds[0] = CHSV(127,255, v);
_cnt++;
}
}我曾尝试将change_callback设置为静态函数,但这会导致公共类成员fade_val出现错误。我有一种感觉,这与指针有关,我仍然对此犹豫不决。重要的是,每个Pad实例都有自己的传感器和自己的fade_val -它们不能在每个Pad之间共享(静态)。
发布于 2017-10-19 14:07:47
解决方案是将您的Pad::change_callback转换为静态one。但是如果你这样做了,你必须把fade_val的作用域也改成静态的,这对你来说是有问题的。另一种解决方案是将Pad::change_callback封装在std::mem_fun object中,但同样需要将此对象的作用域定义为静态。
我的感觉是,你有静态的单一资源,就像连接在电路板上的传感器,并且需要在产生这种冲突的不同实例对象之间共享它。如果是,则静态跟踪该解决方案,该解决方案是在该时间内分配给传感器的当前实例。最简单的方法是将分配的实例放在静态变量中,以便在静态函数调用中找到。
当然,如果您在整个程序中只有一个Pad实例,请将Pad设为singleton或编写一个大小为一的轮询,以便于处理该单个实例。
发布于 2017-12-10 05:12:36
Lambda函数就是这里的方法。不幸的是,automaton API还不允许使用lambdas来捕获这一点。
这是一个特性请求,https://github.com/tinkerspy/Automaton/issues/17,也许我会找点时间来实现它。
https://stackoverflow.com/questions/46802364
复制相似问题