Go Down

Topic: If-Switch-Array-Millis-For (Read 5782 times) previous topic - next topic

leo72

Qualcuno diceva che i computer non sbagliano, sbagliano però gli uomini a programmarli  XD

Testato

e si, hai proprio ragione.

certo che la storia del brake non ha proprio senso, perche' non l'hanno mai corretto ? non vedo nessun utilizzo del comando.
Cioe' se proprio vuoi che sia il case 1 che il 2 venga eseguito, tanto vale farne solo uno. perche' mai potrebbe servire fare due case per poi togliere il brake e farli eseguire entrambi senza il controllo sulla variabile ?

bha
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72


certo che la storia del brake non ha proprio senso,

BREAK, brake è il freno delle macchine  :D :D

Quote

perche' non l'hanno mai corretto ? non vedo nessun utilizzo del comando.

Perché in circolazione ci saranno qualcosa come 40 anni di codice scritto che smetterebbe di funzionare.  ;)

Quote

Cioe' se proprio vuoi che sia il case 1 che il 2 venga eseguito, tanto vale farne solo uno. perche' mai potrebbe servire fare due case per poi togliere il brake e farli eseguire entrambi senza il controllo sulla variabile ?


Questo non lo so.

Testato

Ma a livello Arduino pero' si potrebbe eliminarlo, se veramente non ha nessunissima funzione pratica.
La versione C di arduino non e' forse semplificata per rendere piu' facili le cose ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Andrebbe modificato il compilatore gcc-avr

astrobeed


certo che la storia del brake non ha proprio senso, perche' non l'hanno mai corretto ? non vedo nessun utilizzo del comando.


Break è una istruzione del C, serve per interrompere l'operazione in corso, è importante che ci sia perché senza quel comando non potresti mai uscire in anticipo da un ciclo.
Per esempio puoi usare break per uscire da una for o una while se mentre le esegui si verifica una condizione di errore.
Nella switch  break si usa per interrompere l'esecuzione del ciclo dopo aver eseguito la parte di codice corrispondente alla condizione di ingresso, non ha alcun senso continuare a verificare le altre condizioni, i vari case, visto che la condizione di controllo rimane quella rilevata all'ingresso della switch e non verrebbe eseguito nessun ulteriore codice.

leo72


Break è una istruzione del C, serve per interrompere l'operazione in corso, è importante che ci sia perché senza quel comando non potresti mai uscire in anticipo da un ciclo.
Per esempio puoi usare break per uscire da una for o una while se mentre le esegui si verifica una condizione di errore.

E su questo siamo d'accordo.

Quote

Nella switch  break si usa per interrompere l'esecuzione del ciclo dopo aver eseguito la parte di codice corrispondente alla condizione di ingresso,

Ma difatti la discussione non verteva sull'inutilità del break ma sulla sua obsolescenza. Cioè, dovrebbe essere implicito che arrivati alla fine di un blocco introdotto dallo statemante "case" il flusso di esecuzione proseguisse al di fuori dello switch, dato che il "case" voluto è già stato analizzato.
Se poi uno vuole uscire a metà del blocco, potrebbe introdurre volontariamente un break.

Quote

non ha alcun senso continuare a verificare le altre condizioni, i vari case, visto che la condizione di controllo rimane quella rilevata all'ingresso della switch e non verrebbe eseguito nessun ulteriore codice.

Invece il reference dice l'opposto:
Quote
The break keyword exits the switch statement, and is typically used at the end of each case. Without a break statement, the switch statement will continue executing the following expressions ("falling-through") until a break, or the end of the switch statement is reached.

Se non si mette il break alla fine di un blocco di codice introdotto da un case, l'esecuzione prosegue lungo i blocchi successivi fino al raggiungimento di un break oppure all'uscita dallo switch.

dab77

Non sono un esperto, quindi potrei sbagliare alla grande,ma penso che non è detto che solo un case debba essere Vero. nel senso che io posso aver bisogno anche di controllare le altre condizioni, anche se il primo case è vero, no? per questo non metterei il break.
...certo che se controllo una variabile, non può essere 1 e 2 allo stesso tempo..

quindi si, mi sa che non è utile.

Testato

#68
Nov 10, 2011, 01:07 pm Last Edit: Nov 10, 2011, 01:09 pm by Testato Reason: 1
astro e dab
la situazione assurda e' proprio che omettendo il break non viene controllata la verificabilita' della variabile.

Il case successivo viene eseguito senza che la variabile sia vera, proprio come dice Leo, io logicamente oltre a leggerlo l'ho "Testato" personalmente  :)

infatti non venivo a capo della situazione proprio per questo comportamento illogico, da qui la richiesta di rimozione, in quanto il break e' obbligatorio in un case, quindi per semplificare l'Idea di arduino potrebbe ometterlo visivamente
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Testato

astro e dab
la situazione assurda e' proprio che omettendo il break non viene controllata la verificabilita' della variabile.

Il case successivo viene eseguito senza che la variabile sia vera, proprio come dice Leo, io logicamente oltre a leggerlo l'ho "Testato" personalmente  

infatti non venivo a capo della situazione proprio per questo comportamento illogico, da qui la richiesta di rimozione, in quanto il break e' obbligatorio in un case, quindi visto che Arduino si prefigge la semplificazione, potrebbe "nasconderlo" alla vista dei poveri non programmatori come me.
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Toglierlo è impossibile  :D
Andrebbe cambiato il linguaggio. Non lo faranno MAI, te l'ho già detto  XD XD

Testato

#71
Nov 10, 2011, 02:47 pm Last Edit: Nov 10, 2011, 02:49 pm by Testato Reason: 1
tu sei del campo, io no, quindi probabilmente mi mancano vari passaggi, ma quello che intendo io e' questo:
piu' volte ho letto che scrivere programmi con l'Arduino IDE e' piu' semplice del C puro. Perche' e' piu' semplice ? da quel che ho capito c'e' un wiring punto qualcosa che si inframezza con il compilatore C.
Se ho capito bene la cosa allora quello che intendo io e', usando questa procedura, nascondere il break. cosi' come viene nascosto l'header, o altre cose che ho letto.

Quindi di certo non andare a livello del C o del compilatore, ma nascondere l'assurdita' del break, passandola a chi di dovere durante la compilazione.

Il file c che ne deriverebbe lo continuerebbe ad includere, in modo da restare compatibile con il resto del mondo, e' solo a livello IDE che dovrebbe essere rimosso. Se invece vengono dimostrati dei casi in cui serve allora e' diverso, ma non mi sembra che ce ne siano per ora.
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Io del campo? Ah ah ah  XD XD
Wiring è una estensione del C. E' una libreria che viene inclusa e che aggiunge funzionalità specifiche per gestire l'HW del micro ma non è nulla di diverso rispetto a scriverti le funzioni per proprio conto.
Ma alla fine il compilatore è sempre quello.

Testato

hai una rivista linux, ti assicuro che se non sei del campo (programmazione) lo sei almeno 10 volte piu' di me  :)
Ma ad esempio millis e' una funzione, e fa x cose, creata dall'arduino team giusto ?
in C esiste la funzione millis ?
allo stesso modo potrebbero fare SWITCHCASE che non abbia bisogno di breck

ot: hai in programma articoli sulla nuova ubuntu ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

#74
Nov 10, 2011, 03:32 pm Last Edit: Nov 10, 2011, 03:35 pm by leo72 Reason: 1
Questa è la funzione millis:
Code: [Select]
SIGNAL(TIMER0_OVF_vect)
{
// copy these to local variables so they can be stored in registers
// (volatile variables must be read from memory on every access)
unsigned long m = timer0_millis;
unsigned char f = timer0_fract;

m += MILLIS_INC;
f += FRACT_INC;
if (f >= FRACT_MAX) {
f -= FRACT_MAX;
m += 1;
}

timer0_fract = f;
timer0_millis = m;
timer0_overflow_count++;
}

unsigned long millis()
{
unsigned long m;
uint8_t oldSREG = SREG;

// disable interrupts while we read timer0_millis or we might get an
// inconsistent value (e.g. in the middle of a write to timer0_millis)
cli();
m = timer0_millis;
SREG = oldSREG;

return m;
}

Un contatore come quelli che ho fatto io sul timer 0 e poi una funzione che restituisce tale valore.
Questo per dirti che non è nulla di trascendentale. Ecco perché la gente programma gli Atmega anche in C puro, ricreandosi le cose che mancano. Oppure inglobando semplicemente Wiring.

OT:
non l'ho ancora fatto il test

Go Up