2017-10-18 109 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或者編碼一個單一輪詢來輕鬆處理該單個實例。

相關問題