2017-10-18 345 views
1

来自JavaScript背景的C++/Arduino中的第一个项目。我在使用此代码时遇到了一些问题!我得到这个错误:非静态成员函数的使用无效 - Arduino - 自动机

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

+0

您需要对Pad对象的引用。您应该使用静态功能并使用Pad *作为用户参数。 –

+0

Hey Garr,你可以详细说明Pad *作为用户参数吗? –

回答

0

解决方案是将您的Pad :: change_callback转换为静态的。但是如果你这样做,你必须改变fade_val的范围以及静态,并且不知何故它对你来说是有问题的。另一种解决方法是将Pad :: change_callback放在std::mem_fun object中,但是您需要再次将此对象的范围定义为静态。

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

而且,当然,如果在整个程序中只有一个Pad的实例,则可以使用Pad一个singleton或者编码一个单一轮询来轻松处理该单个实例。

相关问题