djnz ha scritto:Déjà vu... si può usare una logica molto più semplice
djnz: impeccabile come sempre
danielealfa ha scritto:non riesco a capirla, nel uso del ? e del 0 finale
come ti ha indicato
lucaking, ti permettere di scrivere costrutti if/else semplici su una riga, a mio avviso scrivere il codice in meno righe, a meno che queste non diventino criptiche, aumenta la leggibilità.
Andando a step, l'if scritta in maniera estesa sarebbe:
- Codice: Seleziona tutto
if (!primoGiro)
{
if (now - tm < 2000)
{
conta = conta + 1;
}
else
{
conta = 0;
}
}
se nei blocchi if o else hai una sola istruzione, puoi omettere le parentesi:
- Codice: Seleziona tutto
if (!primoGiro)
{
if (now - tm < 2000)
conta = conta + 1;
else
conta = 0;
}
ed usando l'operatore ternario "?" diventa:
- Codice: Seleziona tutto
if (!primoGiro)
conta = (now - tm < 2000) ? conta + 1 : 0;
Potresti scriverla anche così:
- Codice: Seleziona tutto
if (!primoGiro)
(now-tm < 2000) ? conta++ : conta = 0;
o anche (dove avviene una conversione implicita bool -> int):
- Codice: Seleziona tutto
if (!primoGiro)
conta = (conta + 1) * (now - tm < 2000);
quest'ultima forma in particolare è molto brutta e poco leggibile, io l'ho usata in linguaggi dove l'operatore "?" non è disponibile e in condizioni dove è importante mantenere su una riga valutazione ed azione.
Se posso aggiungere un paio di consigli a quelli degli altri:
ho letto il tuo listato velocemente, non invoglia alla comprensione, ma ho notato che memorizzi degli intervalli di tempo misurati con
millis() in tipo di dati
long, questo ti espone ai peggiori bug, ovvero quelli che non "trappi" subito:
la funzione millis() ritorna un unsigned long che va da 0 a 4294967295, quindi dopo 49.7 giorni il registro va in overflow e riparte a contare da zero, se usi sempre degli unsigned long anche per gestire le differenze tra i valori misurati, sei immune dal problema dell'overflow ed ottieni sempre risultati coerenti
ti consiglio di usare i tipi
bool anziché
boolean, il boolean è un alias per il tipo bool, sembra addirittura ci sia una proposta per deprecarlo:
https://arduino.stackexchange.com/questions/43688/using-special-arduino-boolean-data-type-instead-of-standard-bool-data-type