Arduino Präprocessor-Direktive: Gute Möglichkeit für variablen Sketch

Hallo,

ich spiele gerade mit dem Präprocessor, und wollte wissen, ob sich mein Vorhaben insgesamt doch lohnt. Ich habe vor, mein Beleuchtungsprogramm wieder abzuändern und möchte noch deutlich mehr ins Programm packen, als das was ich brauche.

Das Problem ist, nicht jedesmal nutzt mal eine gerade oder ungerade Anzahl an Leds. Das hab ich bislang immer so gemacht, dass ich geprüft, ob die Zahl gerade oder ungerade ist in der Funktion. Das Problem, bei bestimmten Effekten entsteht dabei unweigerlich mehr Code. Wollte mir das nun ersparen, in dem ich vor der Kompilierung schon prüfe, ob die Leds gerade/ungerade sind. Wenn eines der Fälle nicht zutrifft, soll dieser Teil nicht kompiliert werden.
Das macht später bei einer gewissen großen Anzahl Arrays denke mal Sinn.

Also, soweit der Code dafür okay, oder sind da dicke NoGo’s drin?

Gruß Stefan

#include <FastLED.h>
#define NUM_LEDS 20		// Anzahl an Leds am WS2812 Strip
#if NUM_LEDS % 2
#define ODD 1			// NUM_LEDS ungerade
#endif
#define RGBORDER GRB	// RGB Anordnung vom WS2812 Strip
#define DATA_PIN 6		// DATA Pin Arduino
CRGB leds[NUM_LEDS];

void setup(void) {
	FastLED.addLeds<WS2812B, DATA_PIN, RGBORDER>(leds, NUM_LEDS);
	memset(leds, 0, NUM_LEDS * 3);
	FastLED.show();
}

int main(void) {
	init();
	setup();

	while (1) {
		for (int i = 0; i < NUM_LEDS / 2; i++) {
			leds[i] = CHSV(0, 255, 50);
		}
#if ODD
		leds[NUM_LEDS / 2] = CHSV(85, 255, 50);
#endif
		for (int i = (NUM_LEDS + 1) / 2; i < NUM_LEDS; i++) {
			leds[i] = CHSV(170, 255, 50);
		}
		FastLED.show();
	}
	return 0;
}

Ich glaube der macht mit der #if etwas ungewolltest.

	while (1) {
		for (int i = 0; i < NUM_LEDS_ARRAY; i++) {
			leds[i] = CHSV(0, 255, 85);
		}
#if ODD
		leds[NUM_LEDS / 2] = CHSV(85, 255, 85);
#endif
//(1)
		for (int i = 0; i < NUM_LEDS_ARRAY; i++) {
			leds[i + NUM_LEDS_ARRAY] = CHSV(170, 255, 85);
		}

		FastLED.show();
		delay(50);
	}

ab (1) wird nichts mehr ausgführt, sobald die Zahl ungerade ist.

Ich denke, das ist der Unterschied zwischen #ifdef  und   #if
Wenn du abfragen willst, ob ODD überhaupt definiert ist ( was es ja im geraden Fall nicht ist ), nimm #ifdef