OPが示唆したように、私は答えが見つかったので、彼の質問の下にコメントの集計を掲示しています。
異なるソースファイルでこれらのパラメータを共通に定義するには、最も簡単な解決策は共有ヘッダーを作成することです。これを行うには、 FastLedInclude.h
という新しいファイルを作成し、その中に
#include
#define NUM_LEDS 60
#define DATA_PIN 6
次に、すべてのソースファイルで、そのライブラリを使用できるようにするには #include "FastLedInclude.h"
するだけです。
FastLEDライブラリでは、プログラマが構造体を作成する必要があります。これで、ヘッダファイルに構造体の定義(つまり、 struct CRGB leds [NUM_LEDS];
)を配置すると、コンパイラはオブジェクトファイルごとにコードを1回割り当てます。
異なるオブジェクトファイル間でこれを共有する正しい方法は、ヘッダーに extern
を宣言してから、cppまたはinoファイルのいずれかで一度だけ定義することです。
// into FastLedInclude.h
extern struct CRGB leds[];
// into any cpp or ino file (but just once)
struct CRGB leds[NUM_LEDS];
これはメインのinoスケッチファイルでも行うことができますが、私は個人的に別のプログラムに定義する方が好みです(ただし、プログラムの分割方法によって異なります)。
ライブラリを作成したい場合は、他のいくつかの問題が発生します。最も簡単な解決策は、ライブラリフォルダ内にあるヘッダファイルを手動で変更するようにユーザに依頼することです。このソリューションは少し不快ですが、最も安全なソリューションです。
もう1つの解決策は、ユーザにスケッチフォルダにヘッダファイルを作成させることです。ライブラリはスケッチフォルダのパスを知っていなければなりません。しかし、これはライブラリがスケッチの場所を知る必要があり、ライブラリベースのアプローチの根底にある一貫性の原則に違反するため、非常に落胆した選択肢です。
3番目の解決方法は、コンパイル時の静的な定義から動的な静的な定義にアプローチを変更することです。これを行うには、コンパイル時に NUM_LEDS
と DATA_PIN
を定義するのではなく、それらをライブラリクラスの変数として保存します。
たとえば、ライブラリクラス定義では、
class yourclass
{
public:
yourclass(uint8_t data_pin, uint8_t num_leds);
~yourclass();
private:
uint8_t _data_pin;
uint8_t _num_leds;
struct CRGB *leds = NULL;
};
実装は
yourclass::yourclass(uint8_t data_pin, uint8_t num_leds)
{
_data_pin = data_pin;
_num_leds = num_leds;
//Dynamic allocation of the array
leds = (struct CRGB *) malloc(num_leds * sizeof(struct CRGB));
}
yourclass::~yourclass()
{
//you should free the leds array when done
free(leds);
}
次に、ユーザは、
yourclass *obj = new yourclass(6, 60);
// or, if he wants to define,
#define NUM_LEDS 60
#define DATA_PIN 6
...
yourclass *obj = new yourclass(DATA_PIN, NUM_LEDS);
静的に割り当てられたオブジェクトの場合は、
yourclass obj(6, 60);
// or, if he wants to define,
#define NUM_LEDS 60
#define DATA_PIN 6
...
yourclass obj(DATA_PIN, NUM_LEDS);