Ich bin mir nicht sicher, an welcher Stelle sich die Meinung teilt, denn strip ist ein globales Objekt. Anders habe ich das in diesem Forum auch noch nicht gesehen, zumindest erinnere ich mich nicht daran.
Oder meinst Du die "ausführliche" Darlegung der Frage, die "keinerlei" Interpretationsspielraum läßt?
Die Geister scheiden sich dort, wo Funktionen oder Methoden Daten von außerhalb benötigen.
Ich nenne das "Abhängigkeiten injizieren".
Grundsätzlich ist das nötig.
Nur das "Wie?" ist manchmal Diskussionswürdig, bzw. zum drüber nachdenken oder entscheiden.
Der Grund:
Das verwenden von globalen Variablen in Funktionen,
macht diese Funktionen abhängig,
von genau diesen globalen Variablen.
Ok, das klingt arg abgedroschen......
Wird aber sofort zum Wachmacher, wenn man mit 2 (oder mehr) Strips hantiert.
Eine solche Funktion/Methode ist nur für dieses Programm UND für diesen einen Stripe.
Eine universelle Wiederverwendung ist ausgeschlossen.
Eine, wie ich es nenne, Wegwerffunktion.
Übergibt man die Abhängigkeiten per Parameter, wird die Funktion wiederverwendbar.
Ich halte das für einen erheblichen Qualitätsgewinn.
Eine solche Funktion kann man getrost weitergeben, in Libs stopfen, und tausendfach einsetzen.
Es macht nur ein einziges mal etwas mehr Arbeit.
Danach kann man der Faulheit frönen, und entspannt die schon erledigte Arbeit wiederverwenden.
Deinen Änderungsvorschlag habe ich übernommen, mal abwarten, wie sich das auswirkt.
Wie sich das auswirkt?
Wenn du alles richtig gemacht hast, gar nicht.
Wenn du Mist baust, dann versagt das Programm nicht stumm (wie das im Eingangsposting), sondern der Kompiler haut es dir um die Ohren.
Hier mal ein Testprogramm welches beide Fehler vorführt:
#include <Adafruit_NeoPixel.h>
#define PIN 6
#define NUMPIXELS 16 // Popular NeoPixel ring size
#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup()
{
pixels.begin(); // allocate Memory and set pinMode()
}
// test: Adafruit_NeoPixel(const Adafruit_NeoPixel&)=delete;
//void foo(Adafruit_NeoPixel &stripe, int num) // reference: ok
void foo(Adafruit_NeoPixel stripe, int num) // flat copy: bad
{
stripe.setPixelColor(num, stripe.Color(200, 200, 200));
}// destruct copy, frees pixels memory and sets PinMode to input
void loop()
{
pixels.clear();
foo(pixels,1);
foo(pixels,3);
foo(pixels,5);
pixels.show();
delay(DELAYVAL);
// test: Adafruit_NeoPixel& operator=(const Adafruit_NeoPixel&)=delete;
//Adafruit_NeoPixel &bar = pixels; // ok
Adafruit_NeoPixel bar;
bar = pixels; // problematic
foo(bar,2);
foo(bar,4);
foo(bar,6);
/**/
delay(DELAYVAL);
} // destruct bar, frees pixels memory and sets PinMode to input