El futuro de MQL5 es MQL5+ o incluso MQL6 - página 11

 
Alexey Kozitsyn:

Lo tienes todo resuelto. Utiliza una constante NULL.

Déjame contarte un secreto, ya está implementado. Tienes que hacer clic en la rueda del ratón y aparecerá una cruz.

Puedes hacerlo hace mucho tiempo. Desde el navegador se arrastra el indicador a la ventana con el indicador ya adjunto.

En mi opinión, no es lo más necesario.

Tienes un navegador, tienes favoritos, tienes plantillas, tienes perfiles. Todo se puede configurar. Lee la ayuda para el terminal, ¡descubrirás muchas cosas!

Las enumeraciones se utilizan para hacer el código más legible, para eliminar las constantes y sustituirlas por entidades conocidas por el hombre.

Por ejemplo, los valores de la enumeración ENUM_DAY_OF_WEEK pueden utilizarse para comparar con el valor day_of_week de la estructura MqlDateTime. Es decir, se puede escribir así

O puedes escribirlo de otra manera:

SUNDAY es una constante con nombre de tipo int con valor 0.

¿Qué opinas, cómo será más claro para una persona que lea el código?

¡Genial! ¡Gracias por el navegador! No le presté mucha atención. Suelo apagarlo para que no ocupe demasiado espacio. La ayuda, aunque sea a simple vista, la he leído. No me dice nada de arrastrar un indirecto en la ventana de gráficos y encima de otro. Aunque, podría haberlo adivinado e intentado....))

Gracias por explicar la naturaleza de las enumeraciones. Los leí muy rápido, MQL es mayormente derivado de C++, y hay muchos docks para él. Pero un montón de erratas en la ayuda y artículos incompletos no es bueno.

Resultados: ¡una ayuda correctamente redactada puede evitar muchas preguntas estúpidas de los tontos del foro!

En lo que respecta a NULL, es cero: se utiliza mucho. Pero los valores máximos de las variables son extremadamente raros, casi nunca. Por ejemplo, una variable almacena tres estados después de analizar los indicadores: COMPRA, VENTA o NULO. Si utilizamos las constantes ya hechas POSITION_TYPE_BUY, POSITION_TYPE_SELL, una de ellas es cero. Estoy seguro de que EMPTY_VALUE será más popular que NULL si se generaliza a todos los tipos).

 
Alexander Puzanov:

Hay otra aplicación infinitamente útil. Por ejemplo:

Y el usuario obtiene una lista desplegable con una selección de 4 elementos de lo que ha escrito allí en los comentarios - "Sólo comprar", "Sólo vender", etc. Muy útil para listar un conjunto de indicadores, plazos, conjunto de condiciones, etc. en la ventana de configuración del usuario

Sí, por supuesto. En este caso también podemos añadir que simplifica el mecanismo de comprobación de los valores introducidos por el usuario por parte del programa. Es decir, todos ellos (valores correctos) se describen inicialmente.
 
agvozdezkiy:

La parte NULL es cero, y se utiliza a menudo. Por ejemplo, la variable almacena tres estados después de analizar los indicadores: COMPRA, VENTA o NULO. Si utilizamos las constantes listas POSITION_TYPE_BUY, POSITION_TYPE_SELL, una de ellas es NULL.

No hay problema, puedes hacerlo así:

#define  VALUE_EMPTY -1       // Пустое значение для числовых типов данных
#define  STR_VALUE_EMPTY ""   // Пустое значение для строкового типа

Y ponlo donde quieras.

 
Alexey Kozitsyn:

No hay problema, puedes hacerlo así:

Y ponlo donde quieras.

Todo es comprensible. No me refiero a eso.
 
agvozdezkiy:
Todo esto está claro. No me refiero a eso.

Entonces, ¿explica lo que quiere decir? ¿Una única constante para todos los tipos de datos predefinidos? Es poco probable que se aplique algo así.

 
Renat Fatkhullin:

Desgraciadamente, sólo los programadores experimentados comprenden la utilidad e importancia de esta advertencia.

Bueno, recomiendo a todos los demás que se alegren de este nivel de ayuda del compilador y que arreglen sus propios errores. Estos son lugares reales de errores potenciales y es exactamente para los desarrolladores novatos que es críticamente importante aprender.

¿Puedes hacer el espacio de nombres? El problema se resolvería también entonces.
 

El tema de los "métodos puramente virtuales" ya se planteó en el foro hace unos años.

Es decir, en el concepto de C++, métodos virtuales sin cuerpo que DEBEN ser sobrescritos en los descendientes:

virtual void Func1() = 0;

Además, una clase que contenga estos métodos se convierte automáticamente en abstracta. El compilador también hace un seguimiento de esto. (Bueno, es solo para apegarse a los estándares, aunque puedes ocultar el constructor en un ámbito protegido).

Actualmente nos falta mucho comportamiento de los "métodos virtuales puros". Sin esa funcionalidad, no se puede preparar adecuadamente una biblioteca o un framework para externalizarla: se crea una clase hija propia (que no está para nada, sino que se incrusta como un engranaje en otras clases) y se tiene la amabilidad de implementar toda la interfaz. Ahora, heredas, no pones una implementación de método, el compilador se lo traga, no funciona nada. ¿Revisar el código fuente de la clase principal?

El concepto de interfaz es uno de los fundamentos de la POO. Por lo tanto, me gustaría ver la implementación de tal cosa en 5, y no en MQL6

Por cierto, en la documentación sobre las funciones virtuales, hay un error

Виртуальная функция, как и обычная функция, должна иметь исполняемое тело. При вызове семантика ее точно такая же, как и у остальных функций.

Ejemplo:

class Base {
private:
        int a;
public:
        virtual int Func1();
};


class Second: public Base {
public:
        int Func2() {
                return 0;
        };      
};

int OnInit() {

        Base* base = new Base();
        Second* foo = new Second();
   return(INIT_SUCCEEDED);
}

La función virtualFunc1 no tiene cuerpo ejecutable (y ni siquiera devuelve un valor), pero compila sin errores.

 
Igor Volodin:

El tema de los "métodos puramente virtuales" ya se planteó en el foro hace unos años.

Es decir, en el concepto de C++, los métodos virtuales sin cuerpo, que deben ser DEBIDOS de anular en los descendientes:

Además, una clase que contenga estos métodos se convierte automáticamente en abstracta. El compilador también hace un seguimiento de esto. (Bueno, es solo para apegarse a los estándares, aunque puedes ocultar el constructor en un ámbito protegido).

Actualmente nos falta mucho comportamiento de los "métodos virtuales puros". Sin esa funcionalidad, no se puede preparar adecuadamente una biblioteca o un framework para externalizarla: se crea una clase hija propia (que no está para nada, sino que se incrusta como un engranaje en otras clases) y se tiene la amabilidad de implementar toda la interfaz. Ahora, heredas, no pones una implementación de método, el compilador se lo traga, no funciona nada. ¿Revisar el código fuente de la clase principal?

El concepto de interfaz es uno de los fundamentos de la POO. Por lo tanto, me gustaría ver la implementación de tal cosa en 5, y no en MQL6

Por cierto, en la documentación sobre las funciones virtuales, hay un error

Ejemplo:

La función virtualFunc1 no tiene cuerpo ejecutable (y ni siquiera devuelve un valor), pero compila sin errores.

1. Pronto se añadirán funciones virtuales puras

2. ¿En qué parte de su ejemplo se encuentra la llamada Func1? No hay llamada - no hay control del cuerpo.

 
Slawa:

1. Pronto se añadirán funciones virtuales puras

2. ¿Dónde está la llamada Func1 en tu ejemplo? No hay llamada - tampoco hay control del cuerpo.

VS 2015 dijo lo siguiente

Severidad Código Descripción Proyecto Archivo Línea Estado de supresión

Error LNK2001 símbolo externo no resuelto "public: virtual int __thiscall Base::Func1(void)" (?Func1@Base@UAEHXZ) TestCPPCode C:\MyP\AvForex\trunk\TestCPPCode.obj 1

Error LNK1120 1 externos no resueltos TestCPPCode C:\MyP\AvForex\trunk\MQL4FilesForFormatting2015\Debug\TestCPPCode.exe 1

 
Alexey Volchanskiy:

VS 2015 dijo lo siguiente

Severidad Código Descripción Proyecto Archivo Línea Estado de supresión

Error LNK2001 símbolo externo no resuelto "public: virtual int __thiscall Base::Func1(void)" (?Func1@Base@UAEHXZ) TestCPPCode C:\MyP\AvForex\trunk\TestCPPCode.obj 1

Error LNK1120 1 externos no resueltos TestCPPCode C:\MyP\AvForex\trunk\MQL4FilesForFormatting2015\Debug\TestCPPCode.exe 1

Mostrar el código fuente