switch (variabile) {....

Salve ragazzi, avevo bisogno di una delucidazione. faccio prima a scrivere il codice che a spiegarlo:
è corretto scrivere questo:

byte pressBtn = digitalRead(mioPulsante);
  switch (pressBtn) {
    case LOW:
    //fai qualcosa
    case HIGH:
      //fai qualcos'altro
  }

oppure meglio scriverlo così?

byte pressBtn = digitalRead(mioPulsante);
  switch (pressBtn) {
    case 0:
    //fai qualcosa
    case 1:
      //fai qualcos'altro
  }

oppure in entrambi i casi potrei avere problemi?

Ultima casistica dove mi sorge anche il dubbio... al posto di LOW e HIGH si possono passare true o false?

Anticipo: ricordo una discussione dove Guglielmo spiegò tecnicamente che il LOW come il FALSE sono pari allo 0 per l'mcu, e di conseguenza HIGH e TRUE sono pari ad 1. Ma mi sta sorgendo il dubbio dell'utilizzo (riferito ai valori HIGH LOW --- true false) come casistica sotto lo switch...

GRAZIE in anticipo.

... perché siete così pigri da NON andare mai a guardare direttamente nel "core" di Arduino dove queste cose sono definite? ? ? :smiling_imp: :smiling_imp: :smiling_imp:

File Arduino.h:

#define HIGH 0x1
#define LOW  0x0

... quindi, come vedi, 1 o 0 oppure HIGH e LOW, sono la stessa cosa.

Le parole chiave "true" e "false" dipendono dal compilatore (in C++, in C non sono definite), normalmente false è 0 mentro un qualsiasi valore diverso da 0 è true.

Guglielmo

Aspettavo la tua lezione Guglielmo... Te l'ho servita sul piatto d'argento :smiley: :smiley:

Quindi, a ragion del vero, tutte e tre le casistiche sono tranquillamente utilizzabili... anche se mi hai lasciato un velo di dubbio quando scrivi normalmente false ...
Cioè, ci sono condizioni in C dove false != 0???

miky_police:
Quindi, a ragion del vero, tutte e tre le casistiche sono tranquillamente utilizzabili... anche se mi hai lasciato un velo di dubbio quando scrivi normalmente false ...
Cioè, ci sono condizioni in C dove false != 0???

NO, io true e false li lascerei stare dato che, prima di tutto sono definiti SOLO in C++ (e NON in C) e poi il compliatore li tratta come vuole lui quindi ... meglio usarli SOLO come condizioni logiche e non come valori numerici. :wink:

Guglielmo

Poco male... andrò di byte che occupano la stessa dimensione (sottolineo: concetto appreso da vecchie bacchettate quando si utilizzava int per stupidagini... poi si impara mattone dopo mattone :smiley: :smiley: :smiley: )
GRAZIE!!!!

miky_police:
Poco male...

:smiley: ... comunque va bene la versione in cui usi LOW ed HIGH ... sono più "parlanti" e leggibili, tanto, alla fine, il compilatore sempre in 0 ed 1 li trasforma :wink:

Guglielmo

Grazie ancora!

Veramente true e false sono definiti anche in C, dal C99... Basta includere stdbool.h. Questo dà il tipo bool, che Arduino ridefinisce ulteriormente in boolean.

In ogni caso qua, anche se alla fine dei conti funzionerebbe lo stesso, sarebbe sbagliato usarli. Premesso che uno switch è fattibile solo su interi o cose riconducibili ad essi (tipo gli enum), nei vari case solo alcuni valori sono semanticamente corretti, ovvero quelli implicati dal tipo della variabile stessa: se è un enum, ci vanno i valori dell'enum, se è un intero ci vanno degli interi. In questo secondo caso, poi, i valori possono essere rappresentati da costanti con un nome, e questo è proprio il caso in cui cadiamo qua. Quindi la scelta migliore in questo caso sarebbe l'uso di LOW e HIGH (il cui valore non è necessario conoscere, potrebbe anche cambiare nel corso del tempo!).

Nota comunque che in uno switch dovresti sempre mettere anche un caso default, altrimenti nessuno verrà eseguito se il valore della variabile non fosse uno di quelli previsti. A seconda dei casi puoi mapparlo su un caso già esistente o crearne uno apposito per "valore non previsto".

Infine, uno switch con due soli valori, come in questo caso, non ha alcun senso, è pure più lungo da scrivere di un if!

PS: Non dimenticare i break!

SukkoPera:
Veramente true e false sono definiti anche in C, dal C99...

... si, vero, ma è un aggiunta successiva tanto per scimmiottare il bool che esiste in C++ :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Nel testo Sacro (K&R) non se ne fa menzione :wink:

Guglielmo

Beh, ma voglio sperare che nessuno si vincoli al C K&R ormai... Non ha senso, almeno il C99 è supportato più o meno ovunque.

E se proprio mancasse, si sopperisce con un banale:

typedef enum {
  false = 0;
  true
} bool;

SukkoPera:
E se proprio mancasse, si sopperisce con un banale …

… o, ancora più semplicemente, qualche #define … come viene fatto appunto in stdbool.h :smiley:

/* Copyright (C) 1998, 1999, 2000, 2009 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */

/*
 * ISO C Standard:  7.16  Boolean type and values  <stdbool.h>
 */

#ifndef _STDBOOL_H
#define _STDBOOL_H

#ifndef __cplusplus

#define bool        _Bool
#define true        1
#define false        0

#else /* __cplusplus */

/* Supporting <stdbool.h> in C++ is a GCC extension.  */
#define _Bool        bool
#define bool        bool
#define false        false
#define true        true

#endif /* __cplusplus */

/* Signal that all the definitions are present.  */
#define __bool_true_false_are_defined        1

#endif        /* stdbool.h */

… sempre di uno “scimmiottamento” del C++ si tratta :smiling_imp:

Guglielmo

Di base io non userei un switch case con 2 valori, ma con più. Con 2 soli userei if/else. Inoltre in una switch case preferisco usare solo numeri, che rendono più chiaro il codice, secondo me.
Ma a parte queste considerazione di stile capisco il dubbio

Non capisco perché parli di scimmiottamento... A mio avviso è una cosa molto utile che era stata aggiunta prima al C++ e successivamente anche al C, proprio perché ritenuta utile e comoda (nonché spesso aggiunta manualmente in OGNI programma). Inoltre non mi sembra chissà quale grande o pesante "impalcatura" da doverne stare alla larga. Per cui non ci vedo davvero niente di male e personalmente ne faccio uso praticamente sempre.

Silente:
Inoltre in una switch case preferisco usare solo numeri, che rendono più chiaro il codice, secondo me.

Come già detto sopra, questo è semanticamente sbagliato.

SukkoPera:
Non capisco perché parli di scimmiottamento...

E' un radicale, per lui c'è solo il vecchio testamento, il nuovo testamento non lo riconosce :wink:
Scusate, non ho resistito :stuck_out_tongue:

maubarzi:
E' un radicale, per lui c'è solo il vecchio testamento, il nuovo testamento non lo riconosce

VERO ! :smiling_imp:

Guglielmo

P.S.: ... è sei stato anche buono, di solito mi danno proprio del "talebano" :smiling_imp:

Concordo di non usare il switch nei casi di voler distinguere i 2 stati di un entrata digitale. Un if é piú semplice.
ciao Uwe

Io sarei più radicale di Guglielmo ( e già mi sarebbe scappato di nuovo gilberto… fortuna che me ne sono accorto)
io nemmeno uso HIGH e LOW nei test, salto pure lo ==1 o il ==0: il primo è sottinteso ed il secondo è !
a me hanno dato qualche mese fa, del language-nazi, peggio ancora che talebano
ma io dico sempre: o si parla di ‘C’ oppure di un linguaggio di programmazione inventato per l’occasione…
seriamente, si comincia con if …==1
per passare a ==HIGH, per aggiungere == true, ma anche TRUE a seconda del precompilatore
e si perde la concisione del linguaggio, poi la chiarezza di espressione, e alla fine ci si trova nelle paludi di variabili inutili che vengono dichiarate locali sopra ad altre stesso nome globali (ma di diverso tipo)
come ho già detto:
chi non capisce if ( a ) e ha bisogno di if (a == HIGH ) non sta programmando in 'C’
Per Guglielmo: perdonami i due statemente fuori [ code ]

Standardoil:
chi non capisce if ( a ) e ha bisogno di if (a == HIGH ) non sta programmando in 'C'

Diciamo che la prima forma è la più essenziale e implica direttamente che "a" è trattato come booleano, mentre la seconda non da informazioni aggiuntive.
La prima da informazioni in più sull'utilizzo rispetto alla seconda, quindi aumenta la leggibilità e la comprensione.
Poi se uno fa:

String a ...
...
if (a) { ...
...

si fa presto anche a fare una diagnosi medica e a chiamare il 118 :wink:

L'uso di appellativi come talebano e language-nazi possono risultare anche offensivi, per cui si usano se c'è una certa confidenza, io preferisco regalare una camicetta bianca autoabbracciante piena di laccetti che si uniscono dietro e una musichetta rilassante tipi niii nooo niii nooo niii nooo :wink: :stuck_out_tongue:

maubarzi:
Poi se uno fa:

String a ...

...
if (a) { ...
...

sbaglierebbe solo in parte....
È sbagliato l'uso degli oggetti stringa, non il test per vedere se l'oggetto è 'non inizializzato' ovvero col puntatore ancora a NULL, che anche lui, per definizione, è zero

[OFF-TOPIC]

maubarzi:
L'uso di appellativi come talebano e language-nazi possono risultare anche offensivi ...

... ma figuriamoci, dai, non esageriamo adesso con questa fregnaccia del "politically correct" per favore !

[/OFF-TOPIC]

Guglielmo