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

 
FourX:

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.

Una función hace lo mismo que GOSUB / RETURN .

start()
  {
  Print("About to call a function called, a_function . . .");
  a_function();                                               //  GOSUB
  Print("Just returned from a function called, a_function");
  return(0);
  } 
   
   
   
void a_function()
   {
   Print("a_function has been called . . . ");
   return;                                          // RETURN
   }
   
   
   
 
RaptorUK:

Una función hace lo mismo que GOSUB/RETURN...

Reconozco que innumerables funciones estándar y personalizadas pueden ser 'llamadas' y utilizadas en cualquier punto (apropiado) Raptor, pero no hay nada en MQL4 como un GoSub y / o GoTo cualquier lugar específico dentro del programa como GoTo Line 185 o una etiqueta / función específica, etc, como usted mismo describió. Luego ejecutarlo y luego volver al punto en el programa que se llamó a partir de; o tal vez continuar desde que llamó SubRutina y / o sección de programa / Función en función del resultado condicional de esa subrutina. Como has dicho, tú mismo has utilizado GoSub durante años y hacer un salto condicional más allá de un par de líneas de código secuenciales no es lo mismo en absoluto. No quiero seguir debatiendo esta distinción que ya conocemos y que no realiza la misma función en absoluto. Por eso este post. Todavía no hemos descubierto cómo utilizar un verdadero 'GoSub' que, como ejemplo, tal vez salta a un punto anterior en el programa y reutiliza la misma función necesaria ya establecida en el programa en lugar de tener que codificar en repetidas ocasiones cada vez que se necesita.

FYI: El MetaEditor se bloquea alrededor del 85% de las veces que copio texto en él. Esto es en MUCHAS instancias diferentes de MT4 y numerosas computadoras diferentes y en 3 versiones diferentes de Windows. Sin incluir los sistemas de 32 y 64 bits que he utilizado MQL4 en. MT4 está bien, el editor MQL4 no lo es. Por lo tanto, copiar y pegar no es realmente una opción viable para mí. Incluso si lo es, esto todavía no ofrece las mismas capacidades que un 'GoSub' o GoTo' hace.

 

¿Realmente tiene algún sentido esto? Es un hecho que mql4 es mql4, por lo tanto cuando codificas en mql4 tienes que pensar en mql4 no tiene sentido tratar de codificar en un lenguaje mientras consideras como lo hubieras resuelto en otro que soporta diferentes construcciones. Si tienes un problema de codificación en mql4 que crees que sólo puede ser resuelto mediante el uso de GoSub/Return y GoTo's me gustaría verlo, porque creo que siempre hay más de una manera de pelar un gato.

 

FourX:

Incluso si lo es, esto todavía no ofrece las mismas capacidades que un 'GoSub' o GoTo' hace.

Lo siento, me cuesta mucho entender tu punto de vista de que una función MQL4 y un GOSUB son diferentes de alguna manera. (Goto es otra cosa).

Vamos a seguir con esta cosa Gosub. Una función MQL4 es una subrutina. Puede o no puede devolver un valor. Todas las llamadas de subrutina volver a la siguiente línea en el código principal de donde fueron llamados. Estoy 100% de acuerdo con Raptor en esto.

(También estoy de acuerdo con el punto de vista de SDC arriba).

 

El punto del hilo es ver si es posible hacer bifurcaciones condicionales a CUALQUIER lugar dentro del programa, o incluso externamente desde otros programas, para reutilizar módulos/funciones del programa repetidamente, como los que se proporcionan en otros entornos como los mencionados anteriormente: fGoTo, fGoSub. Ya sé que MQL4 no proporciona directamente para estos. Ese es el punto de este hilo: ¿ esposible hacer una 'solución (SubRutina?)' etc para lograr esta funcionalidad? Conceptualmente, esto también tiene similitudes con los archivos de "inclusión" en MQL4.

Similar a la solución que todos utilizamos para compensar las capacidades limitadas del depurador MQL4 por 'Alerting' o 'Impresión' de los valores de la función GetLastError().

Esto no se parece en nada a las funciones normales de MQL4 que contienen un número de booleanos condicionales como if, while, loop, continue, return etc que pueden saltar por delante del bucle de vuelta dentro de la función en que la solución que estoy tratando de proporcionar para las capacidades como los ejemplos dados de otros entornos donde se puede reutilizar cualquier módulo de programación / función repetidamente, a menudo desde (mucho) antes en el programa. Decláralo una vez: úsalo varias veces en la mayoría de los casos en cualquier parte del programa que necesite la funcionalidad que ya se ha proporcionado. El fGoSub en algunos entornos permite a los usuarios importar y utilizar tales otras fSubRoutines, a menudo de pequeños programas separados que son módulos que llevan a cabo una función específica. Tal vez algo similar a los archivos 'Include' de MQL4.

Sólo porque no está ahí ahora, ¿significa eso que no debemos utilizar esta poderosa funcionalidad de programación si podemos crear un 'work around' para ello?

Como todos sabemos, hay numerosas formas de programar algo para obtener el mismo resultado. Este no es un caso de 'Muéstrame tu problema y te diré cómo hacerlo sin un fGoTo ni un fGoSub'. Es un caso de: Si podemos crear la funcionalidad, entonces tenemos esta flexibilidad y capacidad de programación adicional que podemos utilizar de muchas maneras diferentes en muchas situaciones diferentes.

 

Creo que no entiendes lo que es una función personalizada en mql4 . . quizás puedas dar un ejemplo de por qué una función personalizada de mql4 no hace exactamente lo que estás describiendo ? Yo creo que sí lo hace. . . Tengo un montón de funciones que reutilizo en muchos otros EAs, Indicadores y Scripts.

Piense en start() como el programa. . desde cualquier lugar dentro de start puedo llamar a una función personalizada . . cuando la función se hace el programa vuelve a la línea después de la línea donde la función personalizada fue llamada . . al igual que un GOSUB.

 

FourX:

El punto del hilo es ver si es posible hacer bifurcaciones condicionales a CUALQUIER lugar dentro del programa, o incluso externamente desde otros programas, para reutilizar módulos/funciones del programa repetidamente como se proporciona en otros entornos como los mencionados anteriormente: fGoTo, fGoSub.

Estoy tratando de proporcionar para las capacidades tales como los ejemplos dados de otros entornos donde se puede reutilizar cualquier módulo de programación / función repetidamente, a menudo desde (mucho) antes en el programa.

Mql4 es un lenguaje de estilo antiguo, su nivel es alrededor de 1990. Pero su goto y gosub son construcciones aún más antiguas, de alrededor de 1970. ¿Qué sentido tiene hacer que tu estilo de programación sea más antiguo que mql4? Mucho mejor usar un lenguaje de programación real, como C#, a través de dll-s. La mayoría de los inventos de los años 90 y 2000 (como la clase, la interfaz, el objeto, los patrones de diseño como el evento y el oyente, los métodos de programación como la programación dirigida por pruebas, etc.) son para evitar la repetición de código, y ayudarte a escribir rápidamente códigos reutilizables, fiables y legibles. Creo que deberías olvidarte de todo este proyecto goto.
 
FourX:

Reconozco que innumerables funciones estándar y personalizadas pueden ser 'llamadas' y utilizadas en cualquier punto (apropiado) Raptor, pero no hay nada en MQL4 como un GoSub y / o GoTo cualquier lugar específico dentro del programa como GoTo Línea 185 o una etiqueta / función específica, etc, como usted mismo describió. Entonces ejecútalo y luego vuelve al punto del programa desde el que fue llamado;

el retorno dentro de una función hará que se vuelva al lugar desde el que se llamó a la función. Es un sustituto al 100% del antiguo gosub/return. y además la función permite pasar valores y devolver valores, incluso tienen su propio espacio de nombres y marco de pila, por lo que ya no es necesario el lío de las variables globales tampoco. Realmente no entiendo tu problema. Por favor, proporciona un ejemplo concreto (quizás en pseudocódigo o BASIC) de lo que realmente quieres hacer y podríamos mostrarte cómo se haría el mismo ejemplo de una forma mucho más clara y reutilizable y mantenible con if/else, switch/case y llamadas a funciones.

Lo único que realmente falta son las excepciones. ¿Intentas simular excepciones? No puedes hacer esto con GOTO tampoco, también necesitarías cuidar adecuadamente (y desenrollar) la pila de llamadas al hacer esto.

Puedes tener múltiples declaraciones de retorno dentro de la misma función y también puedes salir de los bucles con break, esto es lo más cercano a un GOTO en un lenguaje estructurado y estas cosas (múltiples salidas) ya son mal vistas por algunos puristas estrictos también.

 
erzo:
Es mucho mejor utilizar un lenguaje de programación real, como C#, a través de dll-s.

C# no se recomienda para hacer DLLs que interactúen con esta API de convenciones de llamada de C de bajo nivel. C# es perfecto si quieres interactuar con otro C# y varias cosas de Microsoft, pero no es tan general como otros entornos. Es muy especializado.

Si quieres hacer DLLs que interactúen fácilmente con las convenciones de llamadas C en un lenguaje de programación moderno, entonces sugiero ObjectPascal (Free Pascal) o Delphi.

 
7bit:

No se recomienda C# para hacer DLLs que interactúen con esta API de convención de llamadas de bajo nivel de C.

Sé que java mejor, y consideró a utilizar, pero es difícil hacer un puente. Pero si usted no recomienda C #, que pensé que sería más fácil, voy a tratar de java sin embargo. (Pascal no es mi estilo.) ¡Gracias por su consejo!