[Risolto] Trovare una soluzione adatta.

Buon Anno gente,

vorrei provare a fare una sorta di tabellone illuminato. Il quale dovrei esser in grado di aggiungere o togliere un LED.
Per sapere come sta procedendo ho questa funzione, ma non è quello che mi aspetterei

#define MAX_LEDS 48
int light[MAX_LEDS];

void countdown() {
    for (y = 0; y < MAX_LEDS; y++) {
        if (light[y]) --count_led;
        else if (count_led < MAX_LEDS) ++count_led;
    }
    if (active) {
        if (!count_led) {
            y = random(0, MAX_LEDS);
        }
        else {
            y = MAX_LEDS - count_led;
            active = 0;
        }
        light[y] = TIMEOUT;
    }

void loop() {
    if (digitalRead(INPIN) == 0) active = 1;
    countdown();
}
}

Il ragionamento è che se metto un valore ad una light[n] alla uscita del for avrei un count_led ridotto di uno che è quella che ho attivato. In seguito si dovrebbe allocare una nuova posizione.
Non funziona!, continua a rimanere con il count_led al massimo. Ovvero posso attivare solo light[0] e non passa a quella successiva.

Cosa sto sbagliando ?

Ho risolto, ma con un concetto più semplice.
Nel ciclo di for si esce il ciclo quando si incontra la prima occorrenza libera.

for (y=0; y< MAX_LEDS; y++) {
   if (!light[y]) break;
}
if (active) light[y] = HIGH;

pero' usare la break non e' tanto consigliata come cosa, sopratutto in cicli annidati, in certi contesti e' addirittura vietata; molto meglio trasformare il for in un while con una chiara condizione di uscita

Per quello ho adottato anche un altro sistema, senza il break.

for (y=0; y< MAX_LEDS; y++) {
  if (!light[y]) found = y;
}
if (active) light[found] = HIGH;

Questo mi riporta l’ ultimo trovato che non è ancora stato utilizzato.
Ieri, per trovarmi la soluzione mi sono tradotto il caso in python. Così potevo usare il debugger di python e analizzare riga per riga.
Per questo caso del break è ovvio che si ferma dentro a quel loop di for.

Poi l’ errore del qui questo topico, sta che usavo una uint8_t, mentre al primo ciclo di for, va subito in negativo, che viene compensato per quelle locazioni a zero. La risposta in quel metodo sarebbe stato un numero di locazioni libere, ma non un indice a quale sia una libera.
Nel caso che tutte le locazioni dell’ array fossero state piene, il risultato sarebbe solo negativo. Si poteva invertire al logica, ma sarebbe stato negativo se le locazioni vuote fossero superiori a quelle allocate. Il valore zero sarebbe stato quando vuote e piene fossero uguali.