1

JavaScript のバックグラウンドから生まれた C++/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 間で共有 (静的) することはできません。

4

2 に答える 2

0

解決策は、Pad::change_callback を静的なものに変換することです。しかし、それを行う場合は、fade_val のスコープも static に変更する必要があり、どういうわけか問題があります。もう 1 つの解決策は、Pad::change_callback をstd::mem_fun オブジェクトで囲むことですが、このオブジェクトのスコープを静的として定義する必要があります。

ボードに取り付けられたセンサーのような静的な単一のリソースがあり、この種の静的/インスタンスの競合を生成するさまざまなインスタンス オブジェクト間で共有する必要があると感じています。はいの場合、ソリューションは、その時点でセンサーに割り当てられている現在のインスタンスを静的に追跡します。これを行う最も簡単な方法は、割り当てられたインスタンスを静的変数に配置して、静的関数呼び出し内で見つけられるようにすることです。

もちろん、プログラム全体で Pad のインスタンスが 1 つしかない場合は、Pad をシングルトンにするか、1 つのサイズのポーリングをコーディングして、その 1 つのインスタンスを簡単に処理できるようにします。

于 2017-10-19T06:07:47.143 に答える