Erreurs, bugs, questions - page 2641

 
traveller00:

Il existe un tel conseiller. Une erreur s'est produite

Si vous commentez en continu, c'est bien. Suis-je le seul à penser que c'est étrange ?

Si une fonction n'est pas déclarée comme étant nulle, elle doit renvoyer une valeur:

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
  //---
  return(false);
}
 
La seule sortie de cette fonction est par i==100. Pourquoi pense-t-il que l'apparition de continue entraîne une sortie supplémentaire de la fonction ?
 
traveller00:
La seule façon de sortir de cette fonction est de passer par i==100. Pourquoi pense-t-il que l'apparition de continue conduit à une sortie supplémentaire de la fonction ?

La sortie unique ou multiple n'est pas importante. L'important est que VOUS ayez déclaré une fonction avec un type autre que void - ce qui signifie que la fonction DOIT retourner une valeur.

 

La fonction et renvoie une valeur

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==1)
      continue;
    if(i==100)
      return false;
  }
}

C'est la seule façon de sortir de la fonction. C'est-à-dire le seul endroit où il doit retourner une valeur. Et le compilateur C/C++ est d'accord avec moi. Si MQL a toujours ses propres normes à ce sujet, pourquoi se construit-il normalement si continue est retiré ?

 
traveller00:

La fonction et renvoie une valeur

C'est la seule sortie de la fonction. C'est-à-dire le seul endroit où il doit retourner une valeur. Et le compilateur C/C++ est d'accord avec moi. Si MQL a toujours ses propres normes à ce sujet, pourquoi se construit-il normalement si continue est retiré ?

Le compilateur ne sait pas si la boucle sera traitée et si le code atteindra le retour ; il a donc besoin d'un dispositif de sécurité.

 
Alexey Viktorov:

Le compilateur ne sait pas si la boucle sera traitée et si l'exécution du code atteindra le retour ; c'est pourquoi il exige une précaution de sécurité.

Le compilateur C/C++ le sait parfaitement. Le compilateur MQL est basé sur l'un des compilateurs C/C++, si j'ai bien compris. Mais encore une fois, même s'il a sa propre logique, pourquoi sait-il sans continuer, mais avec continuer, cette connaissance disparaît ?

 
traveller00:

Le compilateur C/C++ le sait parfaitement. Le compilateur MQL est basé sur l'un des compilateurs C/C++, si j'ai bien compris. Mais encore une fois, même s'il a sa propre logique, pourquoi sait-il sans continuer, mais avec continuer, cette connaissance disparaît ?

Probablement parce que seule une personne au premier coup d'oeil regarde un tel code

bool Func()
{
  for(int i=1;;++i)
  {
    if(i==100)
      continue;
    if(i==100)
      return false;
  }
}
peut deviner ce qui va se passer sans réfléchir. À mon avis, ce devrait être C et C++, et non MQL. C'est mql qui protège contre de telles erreurs accidentelles.
 
traveller00:

La fonction et renvoie une valeur

C'est la seule façon de sortir de la fonction. C'est-à-dire le seul endroit où il doit retourner une valeur. Et le compilateur C/C++ est d'accord avec moi. Si le MQL a toujours ses propres normes à cet égard, pourquoi se construit-il normalement si le continu est retiré ?

Votre fonction est un bug. Si i==100, la vérification suivante pour le même i==100 ne fonctionnera pas. Et vous obtiendrez une boucle infinie.

 
Chers développeurs, veuillez signaler l'erreur.
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
Обсуждение статьи "Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II)"
  • 2018.06.10
  • www.mql5.com
Опубликована статья Торговый эксперт с графическим интерфейсом: Наполнение функционалом (Часть II): Автор: Anatoli Kazharski...
 
Alexey Viktorov:

Probablement parce que seule une personne au premier coup d'oeil regarde un tel code

Le programmeur peut deviner ce qui va se passer sans réfléchir. À mon avis, la plainte devrait être adressée à C et C++, et non à MQL. C'est mql qui protège contre ces bugs occasionnels.

Une telle erreur n'existe pas en C/C++.

Sergei Tabolin:

Votre fonction est un bug. Si i==100, la vérification suivante pour le même i==100 ne fonctionnera pas. Et vous obtiendrez une boucle d'infini.

Regardez de plus près. Il n'y a pas d'erreur dans la fonction que j'ai postée ci-dessus.

Raison: