controllo di flusso

#3 – Codice su Arduino: Variabili

Ora che abbiamo una modesta cultura su come memorizzare l’informazione, dobbiamo solo vedere come effettivamente utilizzare queste conoscenze nel nostro codice, tramite le “variabili”.

Prima di andare a vedere cosa sono e come utilizzare le variabili, abbiamo bisogno di alcune convenzioni su come assegnare loro un nome.
Infatti, se ci serve accedere ad una variabile, non vogliamo doverla chiamare con il suo vero indirizzo, ad esempio 0x01A2, ma ci piacerebbe utilizzare un “nome” parlante, che ci aiuti a ricordare a cosa l’avevamo destinata.

Regole per la scelta dei nomi degli identificatori

Non tutti i nomi sono però ammessi. Prendiamo come riferimento le regole di sintassi del C:

1) Il nome di un identificatore/variabile può iniziare solo con una lettera dell’alfabeto o un trattino basso ( _ ), no caratteri speciali. Non può iniziare con un numero.

Esempi validi: nome_variabile, pippo , _pippo, n, numero_n

2) Non sono ammessi spazi tra parole di un identificatore/variabile; Si consiglia di usare _ al posto degli spazi.

Esempi validi: mario_rossi, questo_numero, prossimo_numero

3) Se ci sono due o più parole in un identificatore/variabile – si può usare la cosiddetta “Notazione a Cammello” (o “Camel Case”). In questa notazione, la prima lettera è minuscola o è un _, mentre la prima lettera di ogni parola successiva è scritta maiuscola.

Esempi validi: marioRossi, varName, miaVariabile, _PrimoPuntatore

4) Un identificatore/variabile deve contenere solo lettere, numeri, ed eventuali trattini bassi. Niente caratteri speciali.

Esempi validi: lunghezza1, _case_, Numero23

5) La lunghezza complessiva di un identificatore/variabile non deve superare i 32 caratteri (vi sfido ad utilizzarla, in ogni caso).

6) Un identificatore/variabile deve avere un nome “parlante”. Questo vi aiuterà molto nella stesura del codice. E l’ideale è che il nome sia breve.

7) Tutte le costanti vanno scritte in maiuscolo (suggerimento, non regola).

Variabili

Possiamo vedere una variabile come una sorta di “contenitore”, che ha una dimensione fissata in byte, e in cui salviamo dati binari.

Ogni variabile ha inoltre una posizione nella memoria, specificata da un indirizzo (lo vedremo in una guida avanzata sui puntatori). L’utilizzo del suo identificatore (il suo nome), ci permette di non doverla chiamare con il suo indirizzo ogni volta.

Quello che finora non ho detto, è che anche il microcontrollore – il cervello di Arduino – che esegue il nostro codice, non sa cosa contengono le nostre variabili, se non lo specifichiamo noi.

Infatti, quando il microcontrollore legge 01000001 nella nostra variabile, come fa a sapere se questo è il numero +65, o il carattere ‘A‘ (scritto secondo la codifica più utilizzata per memorizzare i caratteri, ASCII)?

Quindi, quando definiamo una variabile (diremo “dichiarare” una variabile), scriveremo:

tipovariabile nome_variabile;

Innanzitutto, notiamo che alla fine abbiamo messo ‘ ; ‘. Questo perché così diciamo che la riga è terminata. Ometterlo è considerato un errore!

Esempi di corrette dichiarazioni di variabili sono quindi:

int n;
char c;
String messaggio;
long numero;

Costanti

Capita spesso di dover utilizzare gli stessi valori, numerici o testuali, in varie parti del codice. Le regole della buona programmazione suggeriscono di definire quelle che vengono chiamate “Costanti“.

Non si tratta di variabili. Infatti, prima dell’invio del codice ad Arduino, il compilatore provvederà a sostituire ogni occorrenza del nome della costante con il valore da voi indicato (lo vedremo nel dettaglio in seguito).

Ci si potrebbe chiedere allora perché utilizzarle. La risposta è duplice:

  • Permettono di cambiare il valore in questione rapidamente, e senza dimenticarsi qualche occorrenza in giro per il codice
  • Rendono più chiaro il codice, in quanto potete dare a questi valori identificatori “parlanti”

Si definiscono come:

#define NOME_COSTANTE valore //Notare l'assenza di ;

È prassi indicare i nomi delle costanti in maiuscolo (vedi inizio articolo). Ovviamente come valore dovete mettere un numero o una stringa.

Esempio:

#define PIN_LED 10

Array

Spesso può essere necessario salvare in memoria più elementi di uno stesso tipo, che si riferiscono tutti ad un medesimo soggetto. In questo caso, abbiamo a disposizione quelli che vengono chiamati array.

Un array non è niente di più che un elenco di variabili, ognuna identificata da un indice. Se l’elenco contiene n elementi, l’indice va da 0 a n-1 (gli elementi in totale devono essere n).

Definiamo gli array come:

tipovariabili nome_array[numeroelementi];

Ad esempio:

int numeri[5]; //Contiene 5 elementi interi

/*
 * Possiamo visualizzarlo mentalmente come:
 *    
 *  numeri:
 *  [0] => numero0
 *  [1] => numero1
 *  [2] => numero2
 *  [3] => numero3
 *  [4] => numero4
 * 
 * Alla luce di questo, se scriviamo numeri[3] otterremo come valore numero3
 * (il suo significato sarà più chiaro in seguito)
 */

Matrici

Si tratta semplicemente di array multidimensionali. Immaginiamo le matrici come tabelle, con celle di uno stesso tipo di variabile.

È abbastanza immediato capire che avremo bisogno di almeno due indici, non più di uno soltanto come negli array (che vediamo come casi particolari di matrici, dove abbiamo n righe e 1 colonna).

Le definiamo come:

//Nel caso di matrici bidimensionali
tipovariabili nome_matrice[numerorighe][numerocolonne]; 

//Generalizzando
tipovariabili nome_matrice[dimensione1][dimensione2]...[dimensionen];

Ad esempio:

int matrice[3][3];
/*
 * Possiamo visualizzarlo mentalmente come:
 *    
 *  matrice:
 *     n11  n12  n22
 *     n21  n22  n23     dove nij è l'elemento alla riga i nella colonna j
 *     n31  n32  n33
 *
 * Alla luce di questo, se scriviamo numeri[3][2] otterremo come valore n32
 * (il suo significato sarà più chiaro in seguito)
 */

Ovviamente non serve fermarsi alle matrici a due dimensioni… esistono anche le matrici n-dimensionali!

Andiamo adesso a vedere come si utilizzano nella pratica le variabili, nel prossimo articolo.