Branchement conditionnel - 'GoTo' Kluge ? - page 2

 
RaptorUK:
J'ai utilisé les GOTO à l'époque du BBC Basic.... J'ai même utilisé le BBC BASIC dans mon travail à plein temps pendant environ 7 ans... même le BBC Basic avait GOSUB et RETURN pour que les sous-routines (fonctions) puissent être utilisées... pourquoi voudriez-vous utiliser quelque chose qui ressemble à un GOTO dans MQL4 ? peut-être pouvez-vous expliquer votre besoin ?

Salut Raptor,

Comme tu l'as dit toi-même, tu as utilisé ce genre de choses pendant des années et tu es donc conscient de la myriade de situations dans lesquelles elles peuvent être utilisées et qui sont très pratiques. Les fonctions 'GoSub' et 'Return' sont fondamentalement la même idée que le 'GoTO' auquel je fais référence. Cependant, avec les fonctions GoSub/RETURN, on doit retourner au même point dans le programme appelant. Contrairement à 'GoTo' qui ne le fait pas, cela peut créer des cauchemars très désordonnés. Je suppose que la capacité d'utilisation des fichiers Include, Library et .dll dans MQL est similaire à cela. Mais cela ne permet pas le type de contrôle que l'on peut obtenir avec GoSub/RETURN, etc.

De nombreuses itérations de la programmation pour l'usinage informatisé contiennent également les paires GoSub/RETURN, qui sont d'une utilité considérable dans cet environnement. Permet un haut degré de modulation et de réutilisation de nombreux "cycles en boîte" standard ainsi que des fonctions personnalisées et spécialisées, encore et encore, dans de nombreux programmes. Il n'est pas nécessaire de "réinventer" la roue chaque fois qu'on en a besoin. Lorsque j'ai commencé à faire de la programmation d'usinage informatisé à façon, j'étais confronté à plus de 2 000 contrôleurs CNC différents : tous avec leurs propres variations de programmation )< 8) Cela m'a obligé à utiliser des logiciels CAD-CAM très coûteux, ce qui est dommage. Je pouvais souvent écrire moi-même des logiciels considérablement meilleurs et plus efficaces qui produisaient de meilleurs résultats en moins de temps de cycle avec une meilleure usure des outils que ceux que le logiciel générait.

 

GOSUB/RETURN est identique à l'utilisation des fonctions dans MQL4

J'ai fait un peu de programmation CNC il y a de nombreuses années.... Principalement dans le domaine de l'aérospatiale.

 
FourX:

Je ne pense pas que C en ait un, n'est-ce pas ?

Oui, c'est le cas. C'est dans K & R, deuxième édition, page 65. Ils disent qu' ils ne l'utilisent pas dans le livre, puis donnent des exemples à la page suivante !

 

Je pense que ce que nous essayons d'émuler ici est

dog:

cat:

mouse:

   if( bizarre_condition1 ){
      goto cat;
   }

   if( bizarre_condition2 ){
      goto mouse;
   }

   goto dog:

Ce qui peut être fait comme ceci ...

while(true){
   
   // dog:
   if( GOTOstate == DOG ){
   }
   
   // cat:
   if( GOTOstate == DOG || GOTOstate== CAT ){
   }
   
   // mouse:
   //no test needed here, just do MOUSE stuff
   
   
   if( bizarre_condition1 ){
      GOTOstate= CAT;
      continue;
   }

   if( bizarre_condition2 ){
      GOTOstate= MOUSE;
      continue;
   }
   
   GOTOstate = DOG;
}
   

mais pas de manière très élégante, surtout pour beaucoup d'étiquettes. Un meilleur moyen est

while(true){
   
   switch(GOTOstate){
      case DOG:
         // do DOG stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
      case CAT:
         // do CAT stuff
         // break;   // do NOT use the break so you get deliberate FALL-THROUGH
      case MOUSE:
         // do MOUSE stuff
         break;
      default:
         break;     
   }
   
   if( bizarre_condition1 ){
      GOTOstate= CAT;
      continue;
   }

   if( bizarre_condition2 ){
      GOTOstate= MOUSE;
      continue;
   }
}

mais il faut vraiment mettre les appels de fonction dans l'instruction switch, sinon si le switch s'étend sur plusieurs pages de code, on ne peut pas voir la structure du code.

 
FourX:

Bonjour SDC,

Comme pour la plupart des programmes, MQL4 est pratiquement constitué de "fonctions" qui, à part le fait de sauter quelques lignes, n'a pas de véritable fonction "GoTo" que j'essaie de faire dans un EA MQL4. Je ne suisdonc pas sûr de ce que vous "approuvez" et de ce que vous voulez dire dans le contexte de cette recherche ? Veuillez développer et expliquer. Je ne cherche pas à discuter. Il semble que vous ayez quelque chose en tête et j'aimerais savoir ce que c'est et comment cela pourrait nous être bénéfique.


Bonjour FourX J'ai mal lu les messages précédents, je pensais que quelqu'un avait déjà dit ce que je voulais dire, c'est que l'appel de fonction surpasse l'idée de GoTo et améliore son fonctionnement, notamment parce qu'il est plus facile de lire le code après coup lorsqu'il est organisé en fonctions que lorsqu'il s'agit de suivre des GoTo, et comme l'a montré dabbler avec son exemple, le branchement à plusieurs voies en utilisant le commutateur peut réaliser la même chose que des GoTo multiples.

 
dabbler:

Je pense que ce que nous essayons d'émuler ici est

Ce qui peut être fait comme ceci ...

mais pas de manière très élégante, surtout pour beaucoup d'étiquettes. Un meilleur moyen est

mais il faut vraiment mettre les appels de fonction dans l'instruction switch, sinon si le switch s'étend sur plusieurs pages de code, on ne peut pas voir la structure du code.


Salut Dabbler,

Une véritable déclaration/fonction "GoTo" permet de sauter à n'importe quel endroit du programme, et pas seulement de passer à la prochaine (ou aux prochaines) expressions/déclarations. Cela permet, par exemple, de réutiliser les mêmes fonctions qui sont nécessaires dans plus d'une instance d'un programme.

D'où à la fois sa flexibilité et sa commodité. Ce qui, comme je l'ai mentionné, est une épée à double tranchant, car cela peut permettre de se mettre très facilement dans le pétrin et de créer des programmes qui sont des cauchemars.

Est-ce que MQL5 a quelque chose comme un 'GoSub/RETURN', 'GoTo' etc ? Qu'en est-il de Visual Basic, Java, PHP, etc ?

 
RaptorUK:

GOSUB/RETURN est identique à l'utilisation des fonctions dans MQL4

J'ai fait un peu de programmation CNC il y a de nombreuses années.... Je travaillais principalement dans l'aérospatiale.

Pour autant que j'ai pu comprendre jusqu'à présent Raptor, il n'y a rien comme les commandes GoSub / Return ou la possibilité de créer une telle fonction dans MQL4. J'essaie donc de trouver un moyen de réaliser cette fonction dans MQL4.

 
dabbler:

Je pense que ce que nous essayons d'émuler ici est

Ce qui peut être fait comme ceci ...

mais pas de manière très élégante, surtout pour beaucoup d'étiquettes. Un meilleur moyen est

mais il faut vraiment mettre les appels de fonction dans l'instruction switch, sinon si le switch passe sur plusieurs pages de code, on ne peut pas voir la structure du code.

Référence MQL4 - Principes de base - Lasyntaxe de MQL4 ressemble beaucoup à celle du C, à l'exception de certaines caractéristiques :

  • pas d'arithmétique d'adresse ;

  • pas d'opérateur do ... while ;

  • pas d'opérateur goto ... ;

  • pas d'opération de [condition] ?[expression 1] :[expression 2] ;

  • pas de types de données composés (structures) ;

  • les affectations complexes sont impossibles ; par exemple, val1=val2=0 ; arr[i++]=val ; cond=(cnt=OrdersTotal)>0 ; etc ;

  • le calcul d'une expression logique est toujours terminé, jamais interrompu de manière anticipée.

 

Bonjour 1withZachy,

En substance, il semble que le SOP MQL4 utilise simplement une fonction standard ou personnalisée, puis renvoie le résultat à la fonction comme le fait MQL4. Bien que par le diagramme de flux il peut y avoir une distinction subtile que je manque, mais je ne le pense pas. Hélas, la documentation dans l'exemple de code fourni : CallFuntion.mq4' est en russe, ce que je ne comprends pas du tout.

 

Quelques extraits d'un article intéressant sur GoTo sur Wikipedia :

De nombreux langages supportent l'instruction goto, et beaucoup ne le font pas. En Java, goto est un mot réservé, mais il est inutilisable.[1][2] En PHP, il n'y avait pas de support natif pour goto jusqu'à la version 5.3 (des bibliothèques étaient disponibles pour émuler sa fonctionnalité).[3]

Le théorème du programme structuré a prouvé que l'instruction goto n'est pas nécessaire pour écrire des programmes ; une certaine combinaison des trois constructions de programmation de la séquence, de la sélection/choix, et de la répétition/itération est suffisante pour tout calcul qui peut être effectué par une machine de Turing.

Les années 1960 et 1970 ont vu les informaticiens s'éloigner des instructions GOTO en faveur du paradigme de la "programmation structurée". Certaines normes de codage du style de programmation[lesquelles ? ] interdisent l'utilisation des instructions GOTO, notamment en raison du théorème de la programmation structurée mentionné plus haut. La preuve de Böhm-Jacopini n'a pas réglé la question de l'adoption de la programmation structurée pour le développement de logiciels, en partie parce que la construction était plus susceptible d'obscurcir un programme que de l'améliorer.

La critique la plus célèbre de GOTO est probablement une lettre de 1968 d'Edsger Dijkstra intitulée Go To Statement Considered Harmful. [Dans cette lettre, Dijkstra soutient que les instructions GOTO non restreintes devraient être supprimées des langages de niveau supérieur parce qu'elles compliquent la tâche d'analyse et de vérification de l'exactitude des programmes (en particulier ceux qui impliquent des boucles).

Un point de vue alternatif est présenté dans l'ouvrage de Donald Knuth, Structured Programming with go to Statements[6], qui analyse de nombreuses tâches de programmation courantes et constate que dans certaines d'entre elles, GOTO est la construction de langage optimale à utiliser.