Zoals het OP suggereerde, plaats ik een samenvatting van de opmerkingen onder zijn vraag sinds het antwoord werd gevonden.
Om een gemeenschappelijke definitie voor die parameters in verschillende bronbestanden te maken, is de eenvoudigste oplossing om een gedeelde kop te maken. Om dit te doen, maakt u gewoon een nieuw bestand met de naam FastLedInclude.h
en, daarbinnen, schrijf
#include
#define NUM_LEDS 60
#define DATA_PIN 6
Dan moet u in elk bronbestand #omvatten "FastLedInclude.h"
om die bibliotheek te kunnen gebruiken.
De FastLED-bibliotheek vereist ook dat de programmeur een struct maakt. Het plaatsen van de definitie van de struct (dat wil zeggen struct CRGB leds [NUM_LEDS];
) in het header-bestand leidt tot compilatiefouten, omdat de compiler de code schrijft om het eenmaal voor elk objectbestand toe te wijzen.
De juiste manier om dit te delen tussen verschillende objectbestanden is om het extern
in de header te declareren en het dan één keer in een van de cpp- of ino-bestanden te definiëren:
// into FastLedInclude.h
extern struct CRGB leds[];
// into any cpp or ino file (but just once)
struct CRGB leds[NUM_LEDS];
Dit kan ook gedaan worden in het belangrijkste ino schetsbestand, maar persoonlijk geef ik er de voorkeur aan om het in een ander te definiëren (het hangt er echter van af hoe je het programma opsplitst).
Als u een bibliotheek wilt maken, ontstaan er een aantal andere problemen. De eenvoudigste oplossing is om de gebruiker te vragen het headerbestand dat zich in de bibliotheekmap bevindt handmatig te wijzigen. Deze oplossing is een beetje ongemakkelijk, maar het is de veiligste oplossing.
Een andere oplossing is om de gebruiker te dwingen een headerbestand in de schetsmap te maken. Vervolgens moet de bibliotheek het pad van de schemapap kennen om deze terug te zetten. Maar .. Dit is een zeer ontmoedigde optie, omdat het vereist dat de bibliotheek de schetslocatie kent, waardoor het consistentieprincipe wordt geschonden aan de basis van een bibliotheekgebaseerde benadering.
De derde oplossing is om de aanpak te wijzigen, van een statische definitie van compileren tot een dynamische definitie. Om dit te doen, hoeft u in plaats van het definiëren van NUM_LEDS
en DATA_PIN
tijdens het compileren deze als variabelen in de bibliotheekklasse op te slaan.
Bijvoorbeeld in uw bibliotheekklasse-definitie die u hebt
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;
};
En de implementatie kan zijn
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);
}
Dan kan de gebruiker schrijven
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);
of, in het geval van een statisch toegewezen object,
yourclass obj(6, 60);
// or, if he wants to define,
#define NUM_LEDS 60
#define DATA_PIN 6
...
yourclass obj(DATA_PIN, NUM_LEDS);