使用非静态成员函数无效 - Arduino - Automaton

时间:2017-10-18 03:35:26

标签: c++ pointers arduino automaton

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上共享(静态)。

2 个答案:

答案 0 :(得分:0)

解决方案是将您的Pad :: change_callback转换为静态的。但是如果你这样做,你必须将fade_val的范围也改为静态,不管怎么说它对你来说都是有问题的。另一个解决方案是在std::mem_fun object中包含Pad :: change_callback,但是您需要再次将此对象的范围定义为static。

我的感觉是你有静态的单一资源,比如连接到电路板的传感器,需要在产生这种冲突静态/实例的不同实例对象之间共享它。如果是,则解决方案是静态跟踪,这是当时分配给传感器的当前实例。最简单的方法是将分配的实例放在静态变量中,以便在静态函数调用中找到。

当然,如果您在整个程序中只有一个Pad实例,请将Pad设为singleton或编写一个单一的轮询以便轻松处理该单个实例。

答案 1 :(得分:0)

Lambda函数是这里的方法。不幸的是,自动机API不允许使用lambdas捕获[this]。

有一个功能请求,https://github.com/tinkerspy/Automaton/issues/17,也许我找到一些时间来实现它。