aiuto sostituzione goto

buonasera a tutti e da un po che non mi cimentavo piu con qualche piccolo sketch volevo chiedere qualche info su come avrei potuto fare in questo caso:

  while (digitalRead(2)== HIGH){
lettorein:
    delay(20);
    digitalWrite(8, LOW);
    delay(200);
    digitalWrite(9, HIGH);
    delay(2000);
    if(digitalRead(4)== HIGH){
a:
      while(digitalRead(5)== HIGH){
b:
        while(digitalRead(4)== LOW);
        {
c:
          while(digitalRead(5)== LOW){ 
           delay(2000);
          }
          goto c;
        }
        goto b;
      }
      goto a;
    }
goto lettorein;
  }

Definisci una variabile di stato e a seconda delle entrate attive/ spente metti un certo numero. Poi con un switch case o dei if decidi cosa fare.
Dimenticati il delay() e usa al posto suo millis();

Ciao Uwe

Di solito sono bravo nella rimozione dei goto ma questi sono troppo ramificati.
Cancella lo sketch e riscrivilo da capo seguendo i consigli di Uwe.

Mi sembra che tu non abbia ben compreso il funzionamento del while: hai messo alla fine di ogni ciclo while un goto che lo fa ripetere!

Concettualmente è sbagliato in quanto il while viene automaticamente ripetuto finché la condizione è vera.

Elimina tutti i goto e relative etichette e vedrai che il sistema (se la logica è corretta) funzionerà.

Evita l'uso del goto!

hai ragione sulla rimozione dei goto ma il problema è che deve rimanere all'interno finchè non arriva l'attivazione dell'altro ingresso anche se il primo è andato a riposo...
dovrei provare la sostituzione con delle variabili...il problema e che deve verificarsi quella pressione attivazione dell ingresso per uscire dal while...

Esiste con certezza un altro modo di scrivere il codice mantenendo il comportamento voluto.
Se il programma esegue perfettamente quello che desideravi, sei a buon punto e il goto fai finta che non c'è. Se si tratta di un esercizio, al fine di imparare a non usare il goto, allora descrivi cosa deve fare il programma, perché tutti quei goto e while mi fanno girare gli occhi. :stuck_out_tongue:

Ciao.

MauroTec:
Esiste con certezza un altro modo di scrivere il codice mantenendo il comportamento voluto.
Se il programma esegue perfettamente quello che desideravi, sei a buon punto e il goto fai finta che non c'è. Se si tratta di un esercizio, al fine di imparare a non usare il goto, allora descrivi cosa deve fare il programma, perché tutti quei goto e while mi fanno girare gli occhi. :stuck_out_tongue:

Ciao.

concordo a me hanno spiegato che se non si usano e meglio

E' praticamente impossibile capire quel codice, scusami per la franchezza :sweat_smile: , vedo solo while e non capisco cosa deve fare mentre è vera la condizione.
Comunque, esercizio o no, elimina quei go to e ti consiglio di non utilizzarli mai ed imparare a farne a meno, anche perchè sono inutili, hai logiche molto migliori a disposizione.
Se il ciclo while deve ripetersi fino a quando non viene premuto un tasto allora puoi utilizzare una variabile per memorizzare lo stato

boolean stato= true;

while ( stato)
{
   // prima verifichi se il tasto viene premuto
   if(tasto premuto)
     stato = false;

  // e poi fai quello che devi fare
}

Questa è solo un'idea, non ho capito benissimo il tuo scopo.

Salvatore.