¿Compensación forzada de matrices en MT5? - página 2

 
Artyom Trishkin:

Por supuesto que sí.

Cualquier programador que se respete a sí mismo y a sus programas no dejará que las cosas sigan su curso. En MQL4, si no utilizas #property strict, puedes referirte a un array con tamaño 10 por índice 20. Y no pasará nada: el programa seguirá funcionando, pero será el programador quien decida qué usar a continuación. Si es inteligente, seguramente comprobará y controlará todo, para no obtener valores fuera de la matriz, pero si lo hace "a lo bruto", no piensa en ese control, y "lo principal es que funcione, pero cómo funciona...".
La mayoría de los usuarios, que no se han molestado con esto, se han quejado del "malo, malvado y complicado MQL5", porque no les permite falsear sus propias creaciones como antes. Pero los que originalmente pensaron y crearon un código con comprobaciones y control de los datos recibidos, no notaron ninguna diferencia en la complejidad de los lenguajes, y ahora se preguntan - "dónde está la complejidad - es lo mismo...".

El código ha demostrado que la división por cero sin #property strict está permitida y el planeta no se colapsa en un agujero negro, pero a veces uno quiere dividir por cero, pero no le dejan hacerlo
 
Алексей Тарабанов:

Nikolai, no te preocupes por MQL4, todo está bien allí. El tópico rellena las matrices a su gusto. Todo.

Artyom Trishkin:

Por supuesto que sí.

Cualquier programador, que se respete a sí mismo y a sus programas, no dejará que las cosas se deslicen. En MQL4, si no usas #property strict, puedes referirte a un array con tamaño 10 por índice 20. Y no pasará nada: el programa seguirá funcionando, pero será el programador quien decida qué usar a continuación. Si es inteligente, seguramente comprobará y controlará todo, para no obtener valores fuera de la matriz, pero si lo hace "de golpe", no le importa este control, y "lo principal es que funcione, pero cómo...".
La mayoría de los usuarios, que no se han molestado con esto, se han quejado del "malo, malvado y complicado MQL5", porque no les permite falsear sus propias creaciones como antes. Pero los que originalmente pensaron y crearon un código con comprobaciones y control de los datos recibidos, no notaron ninguna diferencia en la complejidad de los lenguajes, y ahora se preguntan - "dónde está la complejidad - es lo mismo...".

¡Qué mal rollo!
Bueno, Petr, gracias a la rigurosidad de MQL5, tienes la oportunidad de poner el código en orden relativo y limpiar el montón de basura.
Incluso puedes intentar compilar el código arreglado con #property strict de vuelta a MQL4 y quizás funcione más rápido en MT4

 
Nikolai Semko:

¡Qué mal rollo!
Bueno, Peter, gracias a la rigurosidad de MQL5, tenemos la oportunidad de poner el código en relativo orden y limpiar los montones de basura.
Incluso puede intentar compilar el código arreglado con #property strict de nuevo en MQL4 y, quizás, funcione mucho más rápido en MT4

Así es como, a priori, has decidido que mi código está lleno de basura.

Me explico: el núcleo se rellena por etapas, en varios pasos. Si al declarar el array en MT5 hay basura en él (cosa que no sabía), entonces en los primeros pasos de la construcción del kernel en las funciones, el array está fuera de alcance, porque en lugar de punteros a variables, me refiero a una celda del kernel a través de otra. Si contiene cero, está bien, y obtiene el valor correcto en la segunda ejecución, pero si contiene basura, se produce un error crítico.

¿Te queda claro?

 
Nikolai Semko:
Peter, no sé a qué te refieres.
...

Exactamente, no lo entiendes. Estás comparando mis tareas con las tuyas...

 
...
Si se producen desbordamientos, busque errores en usted mismo.
Y si hay basura, es tu basura que no has limpiado.

No tengo ningún desbordamiento. Considere los detalles de mi tecnología (olvidó que la ignora). Si utilizas otra celda del array como puntero a una celda, y hay basura en ella, entonces te quedas sin el array. El problema es que para que la celda a la que se refiere obtenga el valor correcto, tiene que pasar a la segunda ronda de construcción del núcleo. Y en la segunda vuelta, el valor será correcto. Pero no se llega a la segunda ronda por un error crítico.

Todo esto se debe a la basura en el array que se declara.

Por lo tanto, tenemos que inventar mecanismos para limpiar la matriz bidimensional (núcleo) en la etapa de la primera configuración del tamaño (construcción del área regular) y en la etapa del segundo redimensionamiento del núcleo, cuando se construye el área de usuario.

 
Реter Konow:

Exactamente, no lo entiendes. Comparado, mis tareas y las tuyas propias...

Adelante, crea un monólogo: 10 puestos más seguidos.

 
Реter Konow:

Así es como, a priori, has decidido que mi código está lleno de basura.

Me explico: el núcleo se rellena por etapas, en varios pasos. Si al declarar el array en MT5 hay basura en él (cosa que no sabía), entonces durante los primeros pasos de la construcción del kernel en las funciones, hay un desbordamiento fuera del array, porque en lugar de punteros a variables, me refiero a una celda del kernel a través de otra. Si contiene cero, está bien, y obtiene el valor correcto en la segunda ejecución, pero si contiene basura, se produce un error crítico.

¿Te queda claro?

No es asíen absoluto . La culpa no es de la basura, sino de la ausencia de #property strict en mql4. Sin ella, obtienes 0 en lugar de array overrun, y en mql5 ya es un error crítico. Probablemente, es mejor comprobar la longitud del array en lugar del contenido de un índice de array inexistente.

 
Alexey Viktorov:

Retag no es así en absoluto. La culpa no es de la basura, sino de la falta de #property strict en mql4. Sin este truco obtienes 0 en lugar de array overrun, y en mql5 ya error crítico. Probablemente, es mejor comprobar la longitud del array en lugar del contenido de un índice de array inexistente.

El fuera de límites se produce porque hay basura en la celda indicadora.

Por ejemplo:

G_CORE[Объект][Канвас] = G_CORE[Окно][Его_канвас];

Inicial:

G_CORE[Objeto][Kanvas] = -123423452345; (basura)

G_CORE[Window][His_canvas]= -452345; (basura)

//-----------------------------------------------------------------

El resultado está fuera de la matriz.

Para reiterar. Algunas celdas tienen valores cero en MT4 y se rellenan en la segunda ronda en la primera etapa de llenado del núcleo.

En MT5, debido a la basura en las celdas, hay un error crítico en la primera ronda.

Si las celdas de la matriz tuvieran ceros, no habría ningún error y el núcleo se llenaría secuencialmente (como debería).

 

Este es un ejemplo más preciso:

La primera ronda de construcción del núcleo. En una de las funciones:

int Ширина_канваса = G_CORE[G_CORE[Окно][Его_канвас]][_X_SIZE];

Если G_CORE[Окно][Его_канвас] = 234523452345; (мусор) то ошибка. А если бы G_CORE[Окно][Его_канвас] = 0; Ошибки нет, и ядро продолжает нормально строится.
 
Реter Konow:

El fuera de límites se produce porque hay basura en la celda indicadora.

Por ejemplo:

Inicial:

G_CORE[Objeto][Kanvas] = -123423452345; (basura)

G_CORE[Window][His_canvas]= -452345; (basura)

//-----------------------------------------------------------------

El resultado está fuera de la matriz.

Para reiterar. Algunas celdas tienen valores cero en MT4 y se rellenan en la segunda ronda en la primera etapa de llenado del núcleo.

En MT5, debido a la basura en las celdas, hay un error crítico en la primera ronda.

Si hubiera ceros en las celdas de la matriz, no habría ningún error y el núcleo se llenaría secuencialmente (como debería ser).

La no inicialización del array es totalmente culpa del kodopistael. Busque el error en su propio entorno. Reconstruya su algoritmo.