Bifurcación condicional - "GoTo" Kluge ? - página 2

 
RaptorUK:
Utilicé GOTOs en los días de BBC Basic. Incluso utilicé BBC BASIC en mi trabajo a tiempo completo durante aproximadamente 7 años ... incluso BBC Basic tenía GOSUB y RETURN para que las subrutinas (funciones) pudieran ser utilizadas ... ¿por qué querrías utilizar cualquier cosa que se parezca a un GOTo en MQL4 ? tal vez usted puede explicar su necesidad ?

Hola Raptor,

Como tú mismo has dicho, tú mismo has utilizado estas cosas durante años y por lo tanto eres consciente de la miríada de situaciones en las que se puede utilizar y que son muy útiles. Las funciones 'GoSub' y 'Return' son básicamente la misma idea que el 'GoTO' al que me refiero. Aunque con las funciones GoSub/RETURN, uno tiene que volver al mismo punto en el programa que llama. A diferencia de 'GoTo' que no lo hace eso puede crear pesadillas muy desordenadas. Aunque supongo que la capacidad de utilización de los archivos Include, Library y .dll en MQL son similares a esto. Pero esto no permite el tipo de control que uno puede obtener con GoSub/RETURN etc

Muchas iteraciones de programación para el mecanizado computarizado contienen los pares GoSub/RETURN también y es de considerable utilidad en ese entorno. Permite un alto grado de modulización y reutilización de numerosos 'ciclos enlatados' estándar, así como funciones personalizadas y especializadas una y otra vez en numerosos programas. No hay que "reinventar" continuamente la rueda cada vez que se necesita. Cuando empecé a hacer programación de mecanizado por ordenador por encargo, me enfrenté a más de 2.000 controladores CNC diferentes: todos con sus propias variaciones de programación )< 8) Esto me obligó a utilizar un software CAD-CAM muy caro, que es para mal. A menudo podía escribir yo mismo unos considerablemente mejores y más eficientes que producían mejores resultados en menos tiempo de ciclo con mejor desgaste de la herramienta que el software generaría.

 

GOSUB/RETURN es lo mismo que usar funciones en MQL4

Hice un poco de programación CNC hace muchos años . Trabajo de AeroSpace principalmente.

 
FourX:

No creo que C tenga uno, ¿verdad?

Sí, es cierto. Está en la página 65 de la segunda edición de K & R. Dicen que no lo utilizan en el libro, y luego dan ejemplos de ello en la página siguiente.

 

Creo que lo que estamos tratando de emular aquí es

dog:

cat:

mouse:

   if( bizarre_condition1 ){
      goto cat;
   }

   if( bizarre_condition2 ){
      goto mouse;
   }

   goto dog:

Que se puede hacer así ...

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

pero no muy elegantemente, especialmente para muchas etiquetas. Una forma mejor es

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

pero realmente hay que poner las llamadas a las funciones en la sentencia switch, de lo contrario si el switch se extiende por varias páginas de código no se puede ver la estructura del código.

 
FourX:

Hola SDC,

Al igual que con la mayoría de la programación, MQL4 es prácticamente todo 'Funciones' que, aparte de saltar algunas líneas, no tiene una verdadera función 'GoTo' que estoy tratando de averiguar cómo hacer dentro de un MQL4 EA Así que no estoy seguro de lo que está 'de acuerdo con' y lo que quiere decir y se refiere en el contexto de esta búsqueda? Por favor, ampliar y explicar. No estoy siendo argumentativo. Parece que tienes algo en mente y me gustaría saber qué es y cómo podría ser beneficioso para nosotros.


Hola FourX leí mal los mensajes anteriores pensé que alguien ya había dicho lo que quería decir es la llamada a la función supera la idea de GoTo y mejora la viabilidad de la misma no menos por el hecho de que es más fácil de leer el código después cuando se organiza en las funciones de lo que es seguir GoTo, y como dabbler mostró con su ejemplo, ramificación multidireccional utilizando el interruptor puede lograr lo mismo que múltiples GoTo.

 
dabbler:

Creo que lo que estamos tratando de emular aquí es

Que se puede hacer así ...

pero no muy elegantemente, especialmente para muchas etiquetas. Una forma mejor es

pero realmente hay que poner las llamadas a las funciones en la sentencia switch, de lo contrario si el switch se extiende por varias páginas de código no se puede ver la estructura del código.


Hola Dabbler,

Una verdadera sentencia/función 'GoTo' permite saltar a CUALQUIER lugar dentro del programa, no sólo saltar sobre el siguiente (par de) Expresiones / Declaraciones. Esto permite cosas como reutilizar las mismas funciones que se necesitan en más de una instancia en un programa.

De ahí su flexibilidad y conveniencia. Que como he mencionado es un arma de doble filo, ya que esto puede hacer que sea muy fácil de conseguir en problemas con él y hacer que los programas que son pesadillas.

¿Tiene MQL5 algo como 'GoSub/RETURN', 'GoTo', etc? ¿Qué pasa con Visual Basic, Java, PHP, etc?

 
RaptorUK:

GOSUB/RETURN es lo mismo que usar funciones en MQL4

Hice un poco de programación CNC hace muchos años . AeroSpace trabajo principalmente.

Por lo que he sido capaz de averiguar hasta ahora Raptor, su es nada como GoSub / Volver comandos o la capacidad de hacer una función de este tipo en MQL4. De ahí mi intento de averiguar un kluge en MQL4 para llevar a cabo esta capacidad.

 
dabbler:

Creo que lo que estamos tratando de emular aquí es

Que se puede hacer así ...

pero no muy elegantemente, especialmente para muchas etiquetas. Una forma mejor es

pero usted realmente necesita para poner las llamadas a la función en la declaración de conmutación de lo contrario si el interruptor se extiende por varias páginas de código que no puede ver la estructura del código.

MQL4 Reference - Basics - La sintaxis de MQL4 es muy parecida a la de C, aparte de algunas características

  • no hay aritmética de direcciones;

  • ningún operador do ... while;

  • ningún operador goto ...;

  • no hay operación de [condición]?[expresión 1]:[expresión 2];

  • no hay tipos de datos compuestos (estructuras);

  • las asignaciones complejas son imposibles; por ejemplo, val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; etc.;

  • el cálculo de una expresión lógica siempre se completa, nunca se termina anticipadamente.

 

Hola 1withZachy,

En esencia esto parece que es MQL4 SOP que realmente sólo utiliza una función estándar o personalizada y luego 'devuelve' el resultado a la función como MQL4 hace. Aunque por el diagrama de flujo su puede ser una distinción sutil que me estoy perdiendo, pero no lo creo. Por desgracia, la documentación dentro del código de ejemplo proporcionado: 'CallFuntion.mq4' está en ruso que no soy capaz de comprender en absoluto.

 

Algunos extractos de un interesante artículo sobre GoTo en Wikipedia:

Muchos lenguajes soportan la sentencia goto, y muchos no. En Java, goto es una palabra reservada, pero no es utilizable. [1][2] En PHP no hubo soporte nativo para goto hasta la versión 5.3 (había bibliotecas disponibles para emular su funcionalidad).[3]

El teorema del programa estructurado demostró que la sentencia goto no es necesaria para escribir programas; alguna combinación de las tres construcciones de programación de secuencia, selección/elección, y repetición/iteración son suficientes para cualquier computación que pueda ser realizada por una máquina de Turing.

En los años sesenta y setenta, los informáticos abandonaron las sentencias GOTO en favor del paradigma de la "programación estructurada". Algunas normas de codificación de estilo de programación prohíben el uso de las sentencias GOTO, especialmente en vista del teorema del programa estructurado antes mencionado. La prueba de Böhm-Jacopini no resolvió la cuestión de la adopción de la programación estructurada para el desarrollo de software, en parte porque la construcción tenía más probabilidades de oscurecer un programa que de mejorarlo.

Probablemente la crítica más famosa a GOTO es una carta de 1968 de Edsger Dijkstra llamada Go To Statement Considered Harmful. [5] En esa carta Dijkstra argumentaba que las sentencias GOTO sin restricciones debían ser abolidas de los lenguajes de alto nivel porque complicaban la tarea de analizar y verificar la corrección de los programas (particularmente aquellos que involucran bucles)

Un punto de vista alternativo se presenta en Structured Programming with go to Statements[ 6] de Donald Knuth, que analiza muchas tareas de programación comunes y encuentra que en algunas de ellas GOTO es la construcción óptima del lenguaje a utilizar.