Errori, bug, domande - pagina 416

 
Yedelkin:

Allora che senso ha specificare default:return(false ) se la variabile appartiene al tipo bool, che in linea di principio ha solo due valori, entrambi utilizzati nell'istruzione switch? In altre parole, l'etichetta predefinita non dovrebbe mai essere eseguita.

P.S. 1. Inoltre, se seguiamo il tuo approccio, allora l'etichetta predefinita diventa obbligatoria invece che opzionale.

2. gli operatori di interruzione non hanno senso in entrambi i casi.

L'operatore switch converte la vostra bool_var in un tipo intero.

E il compilatore non deve sapere che questa variabile ha due valori. Non sta analizzando l'algoritmo in modo logico.

 
Interesting:

Dimentichi un'altra cosa - qualsiasi variabile può avere un valore non valido o essere non inizializzata (avere un valore "spazzatura")...

Non dimentico. Quindi nel mio esempio la variabile è stata inizializzata. Nonostante questo, il compilatore ha generato un errore.

L'esempio conbool_var=-1è estremamente scorretto. Guardate voi stessi:

bool bool_var=-1;
void OnStart()
  {
   Print("bool_var=",bool_var);
  }   
 
Dima_S:

L'istruzione switch converte la vostra bool_var in un tipo intero.

E il compilatore non ha bisogno di sapere che questa variabile ha due valori. Non sta analizzando l'algoritmo in modo logico.

A proposito, con i booleani, c'è una variante fortunata quando una variabile non inizializzata o una variabile con valore -1, per esempio, sarà convertita in vero/falso.

Il che, ovviamente, non accadrà se dichiarate esplicitamente la variabile come int.

Yedelkin:

Non dimentico. Ecco perché la variabile è stata inizializzata nel mio esempio. Nonostante questo, il compilatore ha generato un errore.

L'esempio conbool_var=-1è estremamente scorretto. Convinciti:

Ne sono già convinto ed è per questo che l'ho rimosso. Ma è una fortuna accidentale (considerala come una caratteristica della lingua).

Ma quando si gestisce un possibile errore in un blocco switch, il compilatore non deve capire cosa e come viene inserito lì, quindi il compilatore lo tratta come un errore, non come un avvertimento.

 
Dima_S:

E il compilatore non ha bisogno di sapere che questa variabile ha due valori. Non sta facendo un'analisi logica dell'algoritmo.

Quindi stai dicendo che il compilatore non tiene conto dell'elenco dei valori nell'enumerazione e del loro numero totale?

 
Interesting:

Ma quando elabora un possibile errore in un blocco switch, il compilatore non deve capire cosa e come viene inserito, quindi il compilatore lo tratta come un errore, non come un avvertimento.

La conclusione intermedia è la seguente: l'uso dell'etichetta di default diventa obbligatorio quando si usano enumerazioni+switch?
 
Yedelkin:

1. bool è già un "tipo intero". O stai dicendo che lo switch è una conversione a un tipo intero superiore.

2. Stai dicendo che il compilatore non tiene conto della lista dei valori enum e del loro numero totale?

1. bool è un tipo intero con la dimensione di un byte. La conversione è di tipo int, hai ragione.

2. Anche qui hai ragione. Solo il caso non è un'enumerazione, ma solo un'etichetta per la ramificazione condizionale.

Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
Документация по MQL5: Основы языка / Типы данных / Целые типы / Типы char, short, int и long
  • www.mql5.com
Основы языка / Типы данных / Целые типы / Типы char, short, int и long - Документация по MQL5
 
Dima_S:

1. bool è un tipo intero di un byte. La conversione va al tipo int, hai ragione.

Secondo il manuale, bool è un tipo speciale diverso da integer... Quindi ho cancellato la mia affermazione errata. Anche se non voglio discutere - non sono un esperto.

Dima_S:

Yedelkin:

Quindi vuoi dire che il compilatore non tiene conto dell'elenco dei valori dell'enumerazione e del loro numero totale?

2. Anche qui hai scritto correttamente. Solo il caso non è un'enumerazione ma solo un'etichetta per un ramo condizionale.

Non intendevo etichette di casi ma enumerazioni (considerando il tipo bool come il più piccolo). Ecco un esempio con lo stesso errore di compilazione:

enum Triple
  {
   err=-1,
   no = 0,
   hay= 1
  };
Triple triple_var=err;
Triple Test(void)
  {
   switch(triple_var)
     {
      case  err: return(err);
      case   no: return(no);
      case  hay: return(hay);
      //default:return(hay);
     }
  }
void OnStart()
  {
   Test();
  }

Quindi ripeto la mia domanda su questo esempio: vuoi dire che il compilatore non tiene conto della lista di valori dell'enumerazione Triple e del loro numero totale? Ho tutti i valori enum usati nell'operatore switch.

 
Yedelkin:
La conclusione intermedia è la seguente: l'uso dell'etichetta di default diventa obbligatorio quando si usa enumerazione+switch?

Immaginiamo questo modo (a proposito, il valore 3 non funziona con la dichiarazione esplicita di un valore, ma -1 sì). Ma l'assenza di inizializzazione esplicita della variabile mostrerà che il valore è uguale a quello con indice 0 (tutto questo è ben pensato).

Cosa dovrebbe restituire la funzione se l'opzione predefinita è esclusa?

ENUM_CHART_MODE ChartMode = -1;

string Test()
  {
   switch(ChartMode)
     {
      case 0: return("Bars"); break;
      case 1: return("CANDLES"); break;
      case 2: return("LINE"); break;      
      default: return("Unknown");
     }
  }
void OnStart()
{
Comment(Test());
}
 
Yedelkin:
La conclusione intermedia è la seguente: l'uso dell'etichetta di default diventa obbligatorio quando si usa enumerazione+switch?

sì, se qualcosa deve essere restituito in return().

o almeno in modo che il compilatore possa essere sicuro che la funzione restituisca qualcosa:

bool bool_var=false;
bool Test(void)
  {
   switch(bool_var)
     {
      case  true: return(true);
      case false: return(false);
     }
    return(false);//хотя до сюда ни когда не дойдем, но прописать надо
  }
void OnStart()
  {
   Test();
  }
 
Grazie a tutti per la scienza! Dovrò digrignare i denti per mettere delle righe in più :)
Motivazione: