Referencias de matrices - página 6

 

Para información:

  1. Todos los arrays en MQL5 se pasan sólo por referencia (4 u 8 bytes en la pila), así que no tengas miedo de pasar arrays dentro de las funciones - sin costes especiales.
  2. Es muy peligroso almacenar referencias de memoria reales, especialmente referencias a matrices controladas por el propio terminal(buffers de indicadores, buffers OHLC), porque realmente se modifican/reasignan. Además, es imposible guardar referencias no documentadas entre las llamadas (de salida y de entrada al código del script) al EA.
  3. Cuando se pasa un array a una DLL, se especifica la dirección de inicio del bloque de datos, y las dimensiones tienen que especificarse por separado.
 
mql5:

Lo primero que hay que entender es el ¿POR QUÉ? ¿Y para qué sirve?

Si no quieres hacer enlaces, lo haremos nosotros.

Y gracias a los participantes, gracias a los mensajes en este hilo me enteré, que la descripción en la ayuda es anticuada...

Sí, es divertidísimo ) . Pero realmente, ni siquiera pensé que pudiera publicarse en la ayuda.

¿Puede hablarme ya de todas las banderas entonces?

Renat:

Para información:

  1. Todos los arrays en MQL5 se pasan sólo por referencia (4 u 8 bytes en la pila), así que no tengas miedo de pasar arrays dentro de las funciones - sin costes especiales.

No tengo miedo, soy muy consciente de que es barato. Es un inconveniente.

  1. Es muy peligroso almacenar referencias de memoria reales, especialmente referencias a arrays gestionados por el propio terminal(buffers de indicadores, buffers de OHLC), porque realmente se modifican/reasignan. Además, las referencias no documentadas entre las llamadas (salida y entrada en el código del script) de EA no deben guardarse.

Por favor, explique este punto: ¿puede haber una reasignación de memoria durante OnCalculate? Esto es una mierda.

Sobre las llamadas, por supuesto, está claro.

No quiero tener una función que ate a un indicador o terminal en general, así que usaré la variante más segura disponible.

 
TheXpert:

Más sobre este punto, por favor: ¿puede haber reasignación de memoria durante OnCalculate? Es una locura.


No "durante" - entre.
 
TheXpert:

Más sobre este punto, por favor: ¿puede haber reasignación de memoria durante OnCalculate? Es una pena.

Sobre las llamadas, por supuesto, es comprensible.

Por supuesto, estamos hablando de una posible redistribución entre las convocatorias.

El problema es que alguien guardará la referencia entre las llamadas por error o explícitamente, en el 99% de los casos todo funcionará hasta que se estrelle. Después habrá pensamientos bastante esperados "es culpa de Metakvotes".

Por ejemplo, un compañero nos ha transmitido este tipo de pensamientos y ha seguido haciéndolo durante varios años, incapaz de aceptar el hecho de que la historia entre las convocatorias pueda ser intercambiada/cambiada.

 
Renat:

Por supuesto, estamos hablando de una posible redistribución entre convocatorias.

El problema es que seguro que alguien guarda el enlace entre las llamadas por error o de forma explícita, en el 99% de los casos todo funcionará hasta el choque. Después vendrán los esperados pensamientos de "La culpa es de Metakwots".

"Temer la culpa es no caminar hacia adelante" (c).

Y una cosa más: es mejor lamentar lo hecho, que lo no hecho.

Renat, digamos que estoy de acuerdo en que las variables de referencia son una fuente potencial de problemas, pero esto se puede decir de casi cualquier herramienta. A veces la gente pincha a otras personas con destornilladores. No tiene sentido prohibir ahora los destornilladores, y es aún más insensato retirarlos de la producción, porque se pueden fabricar en casa sin demasiados problemas.

"Referencias" como una entidad mql es muy deseable, ni siquiera en forma de variables, sino como una posibilidad de devolver una referencia ( lvalue ) de la función. Esto permitirá hacer por lo menos realmente rápido indexadores izquierda para los contenedores y dar muchas otras características adicionales, como:

MyTree.Search(Key).GetElement() = NewVal;

Y entiendo que la gente quiera devolver una referencia a una variable local desde una función.

¿Y qué? ¿Olvidar las referencias, porque pueden complicar la vida a los tontos?)

--

Tales limitaciones de mql5 (como la falta de enlaces) a veces motivan fuertemente la "huida a la DLL", convirtiendo a MT5 sólo en un "controlador de mercado" que proporciona conexión con el broker. Pero la idea original era justo lo contrario: eliminar la necesidad de utilizar herramientas de programación externas, porque"todo está aquí".

 

No hay vuelta atrás, ya que buscamos la máxima seguridad lingüística.

Trabajar con enlaces en bruto es un paso sólido y seguro hacia un choque. Y no se permite estrellar los programas con todo el sistema de virtualización sacado.

Nuestra decisión está plenamente fundamentada. MQL5 se utiliza para escribir programas que se ejecutarán en un gran número de ordenadores, y sin intervención humana.

 

En fin, espero que el principio quede claro para quien lo necesite. Lo mantendré por ahora, sólo por diversión. Pero lo será, y estará abierta.

No necesito explicar que las referencias a tipos básicos, como int, son mucho más fáciles de hacer sin demasiados problemas.

La única cuestión que causa complejidad y problemas de aplicación es el alcance de la variable subyacente. Realmente hay un amplio abanico de posibilidades.

________

Bueno, y como motivación cabe destacar que los enlaces abren toda una capa de posibilidades adicionales, como los wrappers por ejemplo.

 
Los enlaces lvalue están previstos...
 
mql5:
Los enlaces lvalue están previstos...
Tío, deberías habérmelo dicho enseguida) no me habría esforzado. Pero esto es genial.
 

Saludos a todos.


Me pregunto si ha cambiado algo en ocho años.

O bien, ¿sigue siendo posible obtener una dirección de matriz de OnCalculate() sólo usando msvcrt.dll y la función memcpy?

¿O todo el mundo sigue "arrastrando" las referencias a los arrays a través de toda la estructura de la clase (alternativamente, organizando sus propios arrays y copiando el contenido cada vez)?