controllo di flusso

#6 – Codice su Arduino: Controllo del flusso di esecuzione

Ora che sappiamo come memorizzare i dati, e abbiamo un’idea su cosa siano le funzioni, ci resta da comprendere uno degli aspetti più importati di un codice: le istruzioni per controllare il flusso di esecuzione.

Per il momento, dovremmo avere una vaga idea come funziona l’esecuzione del nostro codice su Arduino:

  1. La “freccetta” di esecuzione inizia sulla prima istruzione della funzione “Setup”, non appena accendiamo la scheda
  2. Senza intervento, la freccetta si muove sempre dall’alto verso il basso
  3. Quando trova una nostra “chiamata a funzione”, salta sulla prima istruzione delle funzione in questione, e – dopo averle eseguite tutte – ritorna alla funzione “chiamante”, e passa ad eseguire l’istruzione successiva a quella di chiamata.
  4. Arrivata alla fine della funzione “Setup”, passa da sola alla prima istruzione della funzione “Loop”. Qui ripete i punti 2 e 3.
  5. Arrivata alla fine della funzione “Loop”, magicamente riappare sulla prima istruzione della funzione “Loop”, e continua così finché non spegniamo la scheda.

Quindi come fa la freccetta a spostarsi dalla fine della funzione “Loop” al suo inizio? Dobbiamo addentrarci nelle istruzioni di controllo di flusso.

Come alterare il flusso di esecuzione

Ovviamente la capacità di selezionare quale operazione da eseguire e quale no, è fondamentale. Per fare questo, esistono delle tipologie particolari di istruzioni (in aggiunta, vedere qui):

Istruzione Condizionale (IF)
if (variabile == 0){ //Se nella variabile c'è il valore 0
  //Esegui qui dentro
}else if (variabile == 1){ //Altrimenti, se è uguale a 1
  //Esegui qui dentro
}else{ //Se nessuna delle condizioni precedenti è vera
  //Esegui qui dentro
}
Istruzione Ciclica (WHILE)

Utilizziamo l’istruzione while per creare cicli. Il ciclo continua finché la valutazione della condizione è 1. La valutazione viene sempre fatta in testa al ciclo: se la valutazione della condizione restituisce 0 fin da subito, il ciclo non viene mai eseguito, e la freccetta passa all’istruzione successiva.

while(condizione){ //Finché la condizione è valida (== 1)
  //Esegui qui dentro
}

Possiamo creare un ciclo infinito semplicemente ponendo una condizione sempre vera. Una volta entrata in questo ciclo, la freccetta non potrà più uscirne (senza intervento).

while(1){ //Poiché 1==1 è sempre valida, il ciclo non termina mai
  //Esegui qui dentro
}

Per i lettori più curiosi: non è strettamente necessario che la condizione valutata sia == 1, ma semplicemente != 0. Questo significa che scrivere un numero diverso da 0 nella condizione di un ciclo, farà sì che il vostro ciclo continui (ovviamente non è buona cosa farlo).

Istruzione Ciclica (DO WHILE)

L’istruzione è quasi identica a while, solo che la valutazione della condizione viene fatta a fine ciclo. Questo significa che se la prima volta la valutazione è 0, comunque verranno eseguite una volta le istruzioni del ciclo.

do {
  //Esegui qui dentro
} while(condizione);
Istruzione Ciclica (FOR)

L’istruzione for è una versione compatta di un particolare ciclo while. Si compone di tre parti (…; ….; ….) separate da un ‘ ; ‘.

  • Nella prima parte, ci permette di assegnare un valore alle variabili che vogliamo (tipicamente quelle che utilizzeremo nel ciclo).
  • Nella seconda parte, specifichiamo una condizione che deve essere rispettata affinché il ciclo continui. Quando la condizione non è più vera (== 0), il ciclo viene interrotto. Tra gli operandi, va inserito un operatore di confronto.
  • Nella terza parte, possiamo fare assegnamenti (per prassi solo sulle variabili del ciclo).
for(var=0; var < target; var++){
   //Esegui qui dentro
}

Questa istruzione all’apparenza complessa, non è niente di più che un modo sintetico di scrivere:

var = 0;
while(var < target){
  //Esegui qui dentro  
  var++;
}

Esempio:

int i;

for(i=0; i<10; i++){ //Per i che va da 0 a 9
  //Esegui qui dentro
}
//Quando i diventa 10, passa ad eseguire qui sotto

È possibile fare assegnamenti e operazioni su più variabili, distinguendo le istruzioni con ‘ , ‘.

Ad esempio:

for (var1=0, var2=0; var1 < target1 && var2 < target2; var1++,var2++){
   //Esegui qui dentro
}

Interruzione di un ciclo

Può capitare, durante un ciclo, di doverlo interrompere, e passare all’istruzione successiva. Esistono due modi per farlo:

  • Creare una variabile apposta, e metterla in AND logico con la condizione del ciclo.
int i;
bool stop = 0;

for(i=0;i<10 && !stop;i++){ //Il ciclo si interrompe quando i arriva a 10, oppure quando poniamo stop a 1
  //Esegui qui dentro
}
  • Utilizzare una speciale istruzione di sistema, break, che deve essere eseguita all’interno del ciclo
int i;

for(i=0; i<10; i++){ //Esegui da i che va da 0 a 9
   if (i==2){ //Interrompi il ciclo quando i è uguale a 2
     break;
   } 
}