Erreurs, bugs, questions - page 416

 
Yedelkin:

Quel est donc l'intérêt de spécifier default:return(false ) si la variable appartient au type bool, qui n'a en principe que deux valeurs, toutes deux utilisées dans l'instruction switch ? En d'autres termes, l'étiquette par défaut ne devrait jamais être exécutée du tout.

P.S. 1. En outre, si nous suivons votre approche, l'étiquette par défaut devient obligatoire au lieu d'être facultative.

2. les opérateurs de rupture n'ont aucun sens dans les deux cas.

L'opérateur switch convertit votre bool_var en un type entier.

Et le compilateur n'a pas besoin de savoir que cette variable a deux valeurs. Il ne s'agit pas d'analyser l'algorithme de façon logique.

 
Interesting:

Vous oubliez encore une chose : toute variable peut avoir une valeur invalide ou être non initialisée (avoir une valeur "poubelle")...

Je n'oublie pas. Ainsi, dans mon exemple, la variable a été initialisée. Malgré cela, le compilateur a généré une erreur.

L'exemple avecbool_var=-1est extrêmement incorrect. Voyez par vous-même :

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

L'instruction switch convertit votre bool_var en un type entier.

Et le compilateur n'a pas besoin de savoir que cette variable a deux valeurs. Il n'analyse pas l'algorithme de manière logique.

À propos, avec les booléens, il y a une variante chanceuse quand une variable non initialisée ou une variable avec la valeur -1, par exemple, sera transformée en vrai/faux.

Ce qui, bien sûr, ne se produira pas si vous déclarez explicitement la variable comme int.

Yedelkin:

Je n'oublie pas. C'est pourquoi la variable a été initialisée dans mon exemple. Malgré cela, le compilateur a généré une erreur.

L'exemple avecbool_var=-1est extrêmement incorrect. Convainquez-vous :

J'en suis déjà convaincu et c'est pourquoi je l'ai supprimé. Mais c'est une chance accidentelle (considérez-la comme une caractéristique de la langue).

Mais lorsqu'il traite une erreur éventuelle dans un bloc de commutation, le compilateur n'a pas à déterminer ce qui est saisi et comment, et le traite donc comme une erreur et non comme un avertissement.

 
Dima_S:

Et le compilateur n'a pas besoin de savoir que cette variable a deux valeurs. Il ne fait pas une analyse logique de l'algorithme.

Vous dites donc que le compilateur ne prend pas en compte la liste des valeurs de l'énumération et leur nombre total ?

 
Interesting:

Mais lors du traitement d'une erreur éventuelle dans un bloc de commutation, le compilateur n'a pas besoin de comprendre ce qui est entré et comment, il le traite donc comme une erreur et non comme un avertissement.

La conclusion intermédiaire est la suivante : l'utilisation de l'étiquette par défaut devient obligatoire lors de l'utilisation d'énumérations+switch ?
 
Yedelkin:

1. bool est déjà un "type entier". Ou bien vous dites que le switch est une conversion vers un type d'entier supérieur.

2. vous voulez dire que le compilateur ne prend pas en compte la liste des valeurs de l'enum et leur nombre total ?

1. bool est un type entier dont la taille est d'un octet. La conversion est de type int, vous avez raison.

2. Vous avez raison ici aussi. Seul le cas n'est pas une énumération, mais juste une étiquette pour le branchement conditionnel.

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

1. bool est un type entier d'un octet. La conversion se fait en type int, vous avez raison.

Selon le manuel, bool est un type spécial autre que les entiers... J'ai donc supprimé ma déclaration incorrecte. Même si je ne vais pas discuter - je ne suis pas un expert.

Dima_S:

Yedelkin:

Vous voulez donc dire que le compilateur ne tient pas compte de la liste des valeurs de l'énumération et de leur nombre total ?

2. Vous l'avez écrit correctement ici aussi. Seul le cas n'est pas une énumération mais juste une étiquette pour une branche conditionnelle.

Je ne parlais pas des étiquettes de casse mais des énumérations (en considérant le type bool comme le plus petit). Voici un exemple avec la même erreur de compilation :

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();
  }

Je répète donc ma question concernant cet exemple : voulez-vous dire que le compilateur ne prend pas en compte la liste des valeurs de l'énumération Triple et leur nombre total ? J'ai toutes les valeurs de l'énumération utilisées dans l'opérateur de commutation.

 
Yedelkin:
La conclusion intermédiaire est la suivante : l'utilisation de l'étiquette par défaut devient obligatoire lors de l'utilisation de l'énumération+switch ?

Imaginons ceci (à propos, la valeur 3 ne fonctionne pas avec la déclaration explicite d'une valeur, mais -1 oui). Mais l'absence d'initialisation explicite de la variable montrera que la valeur est égale à celle qui a l'indice 0 (tout ceci est bien pensé).

Que doit retourner la fonction si l'option par défaut est exclue ?

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 conclusion intermédiaire est la suivante : l'utilisation de l'étiquette par défaut devient obligatoire lors de l'utilisation de l'énumération+switch ?

oui, si quelque chose doit être retourné dans return().

ou au moins pour que le compilateur puisse être sûr que la fonction retournera quelque chose :

bool bool_var=false;
bool Test(void)
  {
   switch(bool_var)
     {
      case  true: return(true);
      case false: return(false);
     }
    return(false);//хотя до сюда ни когда не дойдем, но прописать надо
  }
void OnStart()
  {
   Test();
  }
 
Merci à tous pour la science ! Je vais devoir grincer des dents pour mettre des lignes supplémentaires :)