Go Down

Topic: Ciclo infinito (Read 600 times) previous topic - next topic

Stilita

Ciao, ho visto che ci sono molti modi per entrare in un ciclo infinito
secondo voi qual'è il modo più elegante per bloccare l'esecuzione del programma
per sempre? (Fino ad un reset esterno, si capisce)
Search is Your friend ... or I am Your enemy ?
But who reads does not know when I tried!

ORSO2001


gpb01

#2
May 16, 2018, 06:53 pm Last Edit: May 16, 2018, 06:56 pm by gpb01
Code: [Select]
while(1){}
In realtà è più ottimizzato (a livello di compilatore):

Code: [Select]
for( ; ; ) ;
La stessa chiamata del loop() nel core di Arduino, si trova in un ciclo fatto così.

Ovviamente, ottimizzazione a parte, il risultato è lo stesso.

Guglielmo

P.S.: Se vuoi puoi anche scriverlo con le graffe aperte/chiuse dopo il for() invece ch il ';' ... come nel caso del while()
Search is Your friend ... or I am Your enemy !

Stilita

Non ho capito il secondo esempio, quello con il FOR, è un altro modo oltre il WHILE
o era un esempio di quello che "capisce" il micro compilando while(1){}?
E comunque grazie a tutti.
Search is Your friend ... or I am Your enemy ?
But who reads does not know when I tried!

gpb01

#4
May 16, 2018, 07:09 pm Last Edit: May 16, 2018, 07:09 pm by gpb01
Non ho capito il secondo esempio, quello con il FOR ...
... è il metodo "raccomandato" ... tu copia quella riga così com'è e quando il programma arriva li, li si ferma per sempre!

Guglielmo
Search is Your friend ... or I am Your enemy !

Etemenanki

... for( ; ; ) ; ...
... ma il compilatore non dovrebbe generare un'errore di missing parameter o roba simile ? ... ???
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

gpb01

#6
May 16, 2018, 07:12 pm Last Edit: May 16, 2018, 07:14 pm by gpb01
... ma il compilatore non dovrebbe generare un'errore di missing parameter o roba simile ? ... ???
No, la sintassi è corretta ... non ha un'inizializzazione, non ha nulla da confrontare (quindi NON diventa mai falso) e non ha un incremento ... gira solo in continuazione su se stesso in un loop strettissimo.

Provare per credere :D

Guglielmo

P.S.: Lo uso normalmente in tutti i casi di "errore non recuperabile" per bloccare qualsiasi cosa.
Search is Your friend ... or I am Your enemy !

Etemenanki

no, non come sintassi ... pensavo che dato che il ciclo for si aspetta dei parametri, non dandoglieli il compilatore ti dovesse avvisare dell'errore ... un po come quando ti da il messaggio che si aspetta il punto e virgola, o che hai dimenticato qualcosa che andava prima di qualcos'altro ... quindi inserire un for senza parametri e' come un'errore che non viene considerato un'errore ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

gpb01

#8
May 16, 2018, 07:17 pm Last Edit: May 16, 2018, 07:17 pm by gpb01
... quindi inserire un for senza parametri e' come un'errore che non viene considerato un'errore ...
NON è un errore, i parametri nel 'for' sono tutti opzionali e NON obbligatori come può essere il ';' alla fine di uno statement, quindi il compilatore, giustamente, non ha nulla da ridire. ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Stilita

Anch'io avevo il dubbio di Etemenanki
ma se lo dice Guglielmo sono sicuro che va.
Bye bye
Search is Your friend ... or I am Your enemy ?
But who reads does not know when I tried!

gpb01

#10
May 16, 2018, 08:05 pm Last Edit: May 16, 2018, 08:06 pm by gpb01
ma se lo dice Guglielmo sono sicuro che va.
Grazie per la fiducia, ma non lo dico io, lo dice il Sacro testo ... il "Kernighan & Ritchie":    :D

Quote
The for statement

for (expr1; expr2; expr3)
   statement

is equivalent to

expr1;
while (expr2) {
  statement
  expr3;
}

except for the behaviour of continue, which is described in Section 3.7.

Grammatically, the three components of a for loop are expressions. Most commonly, expr1 and expr3 are assignments or function calls and expr2 is a relational expression.  Any of the three parts can be omitted, although the semicolons must remain. If expr1 or expr3 is omitted, it is simply dropped from the expansion. If the test, expr2, is not present, it is taken as permanently true, so
for ( ; ; ) {
... }
is an ``infinite'' loop, presumably to be broken by other means, such as a break or return.
Guglielmo
Search is Your friend ... or I am Your enemy !

ORSO2001

Quote
In realtà è più ottimizzato (a livello di compilatore):

Code: [Select]

for( ; ; ) ;
lo sapevo... :D  ... questa discussione era già stata affrontata un po' di tempo fa (non è un deja vu)...nel quale si diceva che il loop() di arduino si basa su un for( ; ; )... ma ho pensato che il while(1), d'impatto, è chiaro...incontrovertibile.

torn24

#12
May 17, 2018, 08:06 am Last Edit: May 17, 2018, 08:07 am by torn24
off topic

Prima di arduino mi ero interessato alla programmazione picmirco "che attualmente ho abbandonato :)"
Nella programmazione dei vari microcontrollori non esiste una funzione loop() come in arduino, quindi si usa un loop infinito, while(1), che ha lo stesso scopo della funzione loop() in arduino, cioè ripetere in continuazione il codice.

Dopo questa premessa che non era rivolta agli esperti, ma soltanto a chi si è cimentato solo con arduino :)
Vorrei far notare che forse la differenza tra for( ; ; ) e while(1) è veramente minima, perché viene usato normalmente il secondo, quindi penso che la differenza in tempi di esecuzione sia veramente trascurabile.

gpb01

#13
May 17, 2018, 08:16 am Last Edit: May 17, 2018, 08:16 am by gpb01
Vorrei far notare che forse la differenza tra for( ; ; ) e while(1) è veramente minima ...
... ovvio che è minima, ma il primo genera, normalmente, un codice più ottimizzato (ovviamente dipende dal compilatore) e ... in applicazioni critiche questo è importante!

Guglielmo
Search is Your friend ... or I am Your enemy !

SukkoPera

Io francamente voglio sperare che un compilatore furbo generi lo stesso identico codice in entrambi i casi, ovvero una jump incondizionata all'inizio del blocco...
Make your Sega MegaDrive/Genesis region-free with Arduino! https://goo.gl/X7zBcq

Guida rapida a ESP8266: https://goo.gl/kzh62E

Go Up