DIfferenza tra riga in if e riga in while........ break

Salve ragazzi vorrei che mi toglieste questa curiosita':
Che differenza passa tra queste righe di codice?

while ((weekday==1)&&(hour>=15&&minuti==0)) {thresholdA=30,thresholdB=10,thresholdC=40; break;}
if (( " " " " " " " " " " " " " " }
la prima mi dava qualche bug mentre la seconda la sto testando.
Tenete presente che di queste righe il programma ne ha circa 60 con vari giorni , varie ore e differenti thresholds.
Grazie

while ((weekday==1)&&(hour>=15&&minuti==0)) {thresholdA=30,thresholdB=10,thresholdC=40; break;}

Come prima cosa ti consiglio di inserire uno spazio tra gli operatori logici (&&) e le condizioni: il tutto risulta più leggibile e ti saresti accorto di aver omesso qualche parentesi e qualche ";"

while ((weekday == 1) && (hour >= 15) && (minuti == 0)) {
  thresholdA = 30;
  thresholdB = 10;
  thresholdC = 40;
  break;
}

Per quel che riguarda la differenza tra le due istruzioni, entrambe corrette (a parte gli errori di cui sopra), la seconda mi sembra più logica.

Ho cercato di metterla su una riga soltanto per ottenere uno sketch piu corto da leggere.
Comunque parentesi e punteggiatura sono ok ho solo sbagliato io a scrivere qui
La riga in "if" non lavora, e non capisco perche visto che dovrebbero avere effetti uguali, le soglie non cambiano, mentre la riga in "while" lavora abbastanza bene anche se a volte si "inventa" un cambio soglia ad un orario che non esiste. Tipo le 2 del pomeriggio che e un orario che non e impostato da nessuna parte.
Non riesco a capire il motivo e da dove si piglia questo orario.

Invece di scrivere del codice che poi non è quello che usi, perché non alleghi lo sketch completo?

capitankevin:
Ho cercato di metterla su una riga soltanto per ottenere uno sketch piu corto da leggere.
Comunque parentesi e punteggiatura sono ok ho solo sbagliato io a scrivere qui
La riga in "if" non lavora, e non capisco perche visto che dovrebbero avere effetti uguali, le soglie non cambiano, mentre la riga in "while" lavora abbastanza bene anche se a volte si "inventa" un cambio soglia ad un orario che non esiste. Tipo le 2 del pomeriggio che e un orario che non e impostato da nessuna parte.
Non riesco a capire il motivo e da dove si piglia questo orario.

Un codice apiccicato non aiuta nella leggibilitá e percui la ricerca errori. Visto che il codice compilato non cambia se inseisci spazi o da capo é meglio puntare sulla leggibilitá.
Per il Tuo problema di funzionalitá non aspettata possiamo aiutarti se ci dai lo sketch completo.
Ciao Uwe

Il codice era scritto correttamente solo che ho saltato una parentesi nel trascriverlo.
ora ve lo rimando con le correzioni che ho applicato (anche se ancora ha un bug che non riesco a tirare via)
Codici in while:
while (( weekday()==1) && (hour()>=7 && minute()>=0)) {sogliaA=25;sogliaB=20;sogliaC=40; break;}
while((weekday()==1) & & (hour()=8 && minute()>=0)) { sogliA.............
Questa funziona anche se mi da un bug che sto cercando di risolvere
Codice in if
if((weekday()==1 ) && (hour()>=7 && minute()>=0)) { sogliaA=25;sogliaB=20;sogliaC=40;}
else if ((weekday()==1) && (hour()=8 && minute()>=0)) {sogliaA.........
Questo invece non lavora non mi cambia le soglie
i codici io li ho scritti tutti in una riga perche in un settimanale ce ne possono essere anche un centinaio.
Bug a parte (che ho capito dove sta) mi domando perche uno lavora e l altro no e questa la stranezza

Io ho provato con una "simulazione":

int sogliaA=0, sogliaB=0, sogliaC=0; 

void setup()
{ delay(1000);
  Serial.begin(9600);

  while ( (weekday()==1) && (hour()>=7 && minute()>=0)) 
  { Serial.println("--while"); 
    sogliaA=25;sogliaB=20;sogliaC=40; break;
  }
  Serial.println(sogliaA); 
  Serial.println(sogliaB); 
  Serial.println(sogliaC); 
  //
  sogliaA=0;sogliaB=0;sogliaC=0;
  if    ( (weekday()==1) && (hour()>=7 && minute()>=0)) 
  { Serial.println("--if");
    sogliaA=25;sogliaB=20;sogliaC=40;
  }
  Serial.println(sogliaA); 
  Serial.println(sogliaB); 
  Serial.println(sogliaC);
}

void loop() {}

int weekday() { return 1; }
int hour()    { return 7; }
int minute()  { return 1; }

E mi risulta tutto okay:

--while
25
20
40
--if
25
20
40

Sicuro non ci sia altro nel tuo codice completo che da problemi?
Oppure che fai prove in momenti diversi con risultati diversi da quelle funzioni?

capitankevin:
Codice in if
if((weekday()==1 ) && (hour()>=7 && minute()>=0)) { sogliaA=25;sogliaB=20;sogliaC=40;}
else if ((weekday()==1) && (hour()=8 && minute()>=0)) {sogliaA.........
Questo invece non lavora non mi cambia le soglie

Probabilmente è un problema di priorità degli operatori logici ... prova a usare le parentesi per chiarire al compilatore esattamente cosa fare e controlla di aver usato == e non = come hai scritto per ( hour() = 8 ) :

if ( (weekday() == 1 ) && ( (hour() >= 7) && (minute() >= 0) ) ) { ....... }
else if ( (weekday() == 1) && ( (hour() == 8) && (minute() >= 0) ) ) { ....... }

Guglielmo

CapitanKevin, se continui a mettere pezzi di codice scritti così come capita, e non vuoi ascoltare le richieste di chi ti aiuta, o non trovi degne di interesse le mie richieste o, forse, non vuoi essere aiutato.

Se ti si chiede di allegare lo sketch significa ALLEGARE lo sketch COMPLETO, non riscriverlo come capita, significa quel che hai letto. E tu invece metti questo (oltretutto senza usare i tag):

while (( weekday()==1) && (hour()>=7 && minute()>=0)) {sogliaA=25;sogliaB=20;sogliaC=40; break;}
while((weekday()==1) & & (hour()=8 && minute()>=0)) { sogliA.............

Dove, oltretutto, c'è un sogliaA ed un sogliA.

Insomma, fai tu. Io chiudo qui, non posso perdere tempo cercando di capire come sono fatte le cose sul tuo programma. Saluti.

Il problema e che vi sto scrivendi con il tablet che non ha il programma per zippare e lo sketch e lungo 4 pagine :disappointed_relieved:
Appena posso vi mando il codice completo.
Scusatemi e buon anno ancora

nid69ita:
Io ho provato con una "simulazione":

Nid con la tua prova ho notato una cosa che non sapevo,
io credevo che la funzione Setup venisse eseguita prima della loop, e per una sola volta,
ma invece con il tuo esempio viene eseguito prima il LOOP ?
Mi sarei aspettato che il tuo codice non entrava mai ne' nel while ne' negli if, perche' l'orario lo imposti nel loop, e quindi all'esecuzione del setup e' ancora tutto a 0-0-0

Nid con la tua prova ho notato una cosa che non sapevo,
io credevo che la funzione Setup venisse eseguita prima della loop, e per una sola volta,
ma invece con il tuo esempio viene eseguito prima il LOOP ?
Mi sarei aspettato che il tuo codice non entrava mai ne’ nel while ne’ negli if, perche’ l’orario lo imposti nel loop, e quindi all’esecuzione del setup e’ ancora tutto a 0-0-0

Io invece ho notato che ci hai visto male e capito altrettanto. Sotto periodo festivo di capodanno è un fenomeno comune prendere fischi per fiaschi. Il capodanno ti toglie un anno di vita + 1 che è già passato.
:stuck_out_tongue:
Ciao.

Testato:
Nid con la tua prova ho notato una cosa che non sapevo,
io credevo che la funzione Setup venisse eseguita prima della loop, e per una sola volta,
ma invece con il tuo esempio viene eseguito prima il LOOP ?
Mi sarei aspettato che il tuo codice non entrava mai ne' nel while ne' negli if, perche' l'orario lo imposti nel loop, e quindi all'esecuzione del setup e' ancora tutto a 0-0-0

No, @Testato, tutto sempre uguale, la setup() 1 volta e per prima rispetto alla loop() eseguita di continuo, come detto anche da @MauroTec.
Nella mia simulazione non ho collagato un hw, perciò faccio io le 3 funzioni dell'orario ritornando valori fissi che fanno scattare il test. Era per verificare che if e while, se scritti allo stesso modo, scattano allo stesso modo.

nid69ita:
No, @Tastato

Uh, allora le nuove prove da ora non saranno: "testare l'hardware" ma "tAstare l'hardware" :stuck_out_tongue_closed_eyes:

MauroTec:
Sotto periodo festivo di capodanno è un fenomeno comune prendere fischi per fiaschi

Mauro troppo buono, non e' effetto capodanno, la mia e' incompetenza stabile :slight_smile:

ho visto la svista, weekday ecc ecc sono funzioni, quindi vengono richiamate ovunque vengano scritte,
diciamo che per comodita' di lettura invece che nel loop le avrei messe nel setup stesso

void setup()
{
  delay(1000);
  Serial.begin(9600);

  int weekday() {
    return 1;
  }
  int hour()    {
    return 7;
  }
  int minute()  {
    return 1;
  }

Ecc, Ecc,

Mauro troppo buono, non e' effetto capodanno, la mia e' incompetenza stabile :slight_smile:

ho visto la svista, weekday ecc ecc sono funzioni, quindi vengono richiamate ovunque vengano scritte,
diciamo che per comodita' di lettura invece che nel loop le avrei messe nel setup stesso

Si ma così vanifichi i miei sforzi. Definire una funzione dentro un altra si chiama nested function e serve a limitare lo scope di visibilità. Le funzioni nid non le ha messe dentro la funzione loop ma fuori, se le avesse messe dentro il loop non avrebbe potuto usarle al di fuori della funzione loop, ma solo al suo interno.

In ogni caso eviterei di imboscare funzioni dentro altre e solo in casi eccezionali potrei essere tentato e non resistendo finirei per usarle.

PS: io sono convinto che i bagordi festivi siano in parte responsabili di tale svista. :stuck_out_tongue:

Ciao.

void loop() {}

maledette graffe, lo dico io che sono meglio quelle in pasticceria :sweat_smile:
Ora tutto torna :slight_smile:
Grazie

NO, non puoi definire delle funzioni all'interno di una funzione ... l'IDE di Arduino da errore in compilazione :frowning:

Al limite, per fare una cosa più leggibile, le poteva dichiarare tutte all'inizio, prima del loop().

Oltretutto, se invece dell'IDE (che nasconde la necessità di creare i prototipi) stava usando un normale compilatore C, mettendole PRIMA di richiamarle poteva evitare i prototipi, mettendole dopo ... doveva necessariamente creare anche i prototipi :wink:

Guglielmo

Per chiarezza ...

void setup() {
 
 int pippo() {
  
 }    
}

void loop() {

}

ritorna un bel :

sketch_jan02a.ino: In function 'void setup()':
sketch_jan02a:3: error: a function-definition is not allowed here before '{' token

Guglielmo

yes, ho visto
quindi nell'ide arduinico non si puo' usare il nested function che dice Mauro ?