OP'nin önerdiği gibi, cevabın bulunduğundan beri kendi sorusu altındaki yorumların bir özetini yayınlıyorum.
Farklı kaynak dosyalarındaki bu parametreler için ortak bir tanım yapmak için en kolay çözüm, paylaşılan bir başlık oluşturmaktır. Bunu yapmak için FastLedInclude.h
adlı yeni bir dosya oluşturmanız yeterlidir.
#include
#define NUM_LEDS 60
#define DATA_PIN 6
Daha sonra her kaynak dosyasında, bu kütüphaneyi kullanabilmek için #include "FastLedInclude.h"
'a sahip olmanız yeterlidir.
FastLED kitaplığı ayrıca programcının bir yapı oluşturmasını gerektirir. Şimdi, derleyici, her bir nesne dosyası için bir kez tahsis etmek için kod yazdığı için, yapının tanımını (ör. struct CRGB ledleri [NUM_LEDS];
) başlık dosyasına yerleştirmek derleme hatalarına yol açar.
Bunu farklı nesne dosyaları arasında paylaşmanın doğru yolu, başlıkta extern
'i belirtmek ve daha sonra cpp veya ino dosyalarından birinde bir kez tanımlamaktır:
// into FastLedInclude.h
extern struct CRGB leds[];
// into any cpp or ino file (but just once)
struct CRGB leds[NUM_LEDS];
Bu, ana ino çizim dosyasında da yapılabilir, ancak kişisel olarak bunu başka bir tanımlı olarak tanımlamayı tercih ederim (ancak, programı nasıl böldüğünüze bağlıdır).
Bir kütüphane oluşturmak istiyorsanız, başka problemler ortaya çıkar. En kolay çözüm, kullanıcının kütüphane klasöründe olacak olan başlık dosyasını manuel olarak değiştirmesini istemektir. Bu çözüm biraz rahatsız edici, ama en güvenli olanı.
Başka bir çözüm ise, kullanıcıyı eskiz dosyasına bir başlık dosyası oluşturmaya zorlamaktır. Daha sonra kütüphane, arka planı içerecek eskiz klasör yolunu bilmelidir. Ama .. Bu çok cesaretsiz bir seçenek, çünkü kütüphanenin çizim yerini bilmesi ve böylece kütüphane tabanlı bir yaklaşımın temelinde tutarlılık ilkesini ihlal etmesi gerekecek.
Üçüncü çözüm, bir derleme zamanı statik tanımından dinamik olana yaklaşımı değiştirmektir. Bunu yapmak için, derleme zamanında NUM_LEDS
ve DATA_PIN
tanımlamak yerine, bunları kitaplık sınıfındaki değişkenler olarak kaydedersiniz.
Örneğin, kitaplık sınıf tanımınızda
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;
};
Ve uygulama olabilir
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);
}
Sonra kullanıcı yazabilir
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);
veya statik olarak ayrılmış bir nesne durumunda,
yourclass obj(6, 60);
// or, if he wants to define,
#define NUM_LEDS 60
#define DATA_PIN 6
...
yourclass obj(DATA_PIN, NUM_LEDS);