Ciao, osservando l'integrazione di writeCell() mi ha colpito l'uso misto che fai delle variabili globali e degli argomenti di funzione.
Cerco di spiegarmi meglio con un esempio "stupido".
Supponiamo di avere una funzione somma() che appunto ritorna il risultato della somma di due interi:
int somma(int a, int b) {
return a + b;
}
Questa funzione è in un certo senso "autocontenuta", cioè
1) se ne può spiegare il funzionamento senza far riferimento ad altro codice
2) può essere utilizzata così com'è in qualunque sketch senza alcuna modifica.
Ora immaginiamo di usare questa funzione in un programma complesso, in cui ad esempio abbiamo due variabili livello1 e livello2, e una terza variabile livelloTotale che rappresenta la somma dei due livelli. Potremmo integrare la funzione somma in questo modo:
int livello1;
int livello2;
int livelloTotale;
void sommaLivelli() {
livelloTotale = livello1 + livello2;
}
Utilizzo:
// leggi livelli attuali
livello1 = readLevelSensor(...);
livello2 = readLevelSensor(...);
// calcola nuovo livello totale
sommaLivelli();
// visualizza il nuovo livello totale
lcd.print(livelloTotale);
Nota che la funzione sommaLivelli(), a differenza di somma(), non è generale. Per comprenderla è necessario fare riferimento a variabili definite al di fuori di essa. Inoltre non è possibile copiarla così com'è in altri programmi, a meno di non introdurre anche in essi le varaibili livelloTotale, livello1 e livello2, che probabilmente non avrebbero senso al di fuori del loro contesto originale.
Il modo corretto di utilizzare somma() è invece:
// leggi livelli attuali
livello1 = readLevelSensor(...);
livello2 = readLevelSensor(...);
// calcola nuovo livello totale
livelloTotale = somma(livello1, livello2);
// visualizza il nuovo livello totale
lcd.print(livelloTotale);
Quindi la morale è:
- non utilizzare variabili globali per passare argomenti ad una funzione né per ritornare il valore calcolato al programma principale
- le funzioni debbono essere il più possibile indipendenti dal programma in cui sono inserite
(naturalmente si tratta di princìpi guida che vanno poi interpretati caso per caso...)
Per concludere, tornando all'integrazione di writeCell(), nella prospettiva di utilizzare box medicine con diverso numero di righe e colonne è meglio lasciare la writeCell() così come l'ho scritta io, e invece di "fonderla" con verirow(), _utilizzarla_ all'interno di verirow() in questo modo:
verirow() {
calcola il numero della cella e il numero del paziente in base al numero di medicina
writeCell(numero cella, numero paziente)
}
Così la writeCell() rimane legata soltanto al modo in cui la matrice di led è costruita e collegata all'arduino, mentre la verirow() è legata ai dati e alle convenzioni del programma (ad esempio il fatto che le medicine sono numerate da 1 a 33, le 1-16 son di un paziente e le 17-33 di un altro), e interfaccia i due "mondi" convertendo il numero di medicina selezionato in valori "digeribili" dalla writeCell(), cioè a partire dal numero di medicina calcola il numero della cella e quale dei due led accendere.