Discusión sobre el artículo "Variables y tipos de datos extendidos en MQL5"

 

Artículo publicado Variables y tipos de datos extendidos en MQL5:

Las variables y los tipos de datos son temas muy importantes no solo en la programación MQL5, sino también en cualquier lenguaje de programación. Las variables y los tipos de datos de MQL5 pueden dividirse en simples y extendidos. Aquí veremos las variables y los tipos de datos extendidos. Ya analizamos los sencillos en un artículo anterior.

En este artículo, consideraremos nuevas variables y tipos de datos en MQL5, así como su aplicación en el desarrollo del software comercial MQL5. Asimismo, aprenderemos más sobre algunos conceptos avanzados de variables y tipos de datos y los abarcaremos en los siguientes temas:


    Autor: Mohamed Abdelmaaboud

     
    MetaQuotes:

    Echa un vistazo al nuevo artículo: Variables y tipos de datos avanzados en MQL5.

    Autor: Mohamed Abdelmaaboud


    No estoy de acuerdo en cierta medida que una directiva de preprocesador se puede mencionar en el contexto de las variables const.

    La palabra clave const tiene un efecto diferente que un #define "constante".

    const puede ser muy útil en las firmas de función, ya que establece el valor de los parámetros pasa en modo de sólo lectura. const es una palabra clave especialmente diseñada para el codificador. No tiene representación en el binario ejecutable producido por el compilador.

    En contraste con una variable const, una sentencia #define es un valor llamado r, que esta en una region de memoria de solo lectura en el binario ejecutable, y por lo tanto no puede ser cambiado.

    Además, #define es una directiva de etapa de preprocesador, y en realidad sólo reemplaza todas las ocurrencias en el archivo fuente. Esto se hace antes de que el compilador vea el código a compilar.

    Además, la directiva #define no tiene una "ubicación" global, puede aparecer en cualquier parte del fichero fuente. En la etapa del preprocesador, el concepto de bloques de código "{...}" no está disponible, ni se evalúa.

    La visibilidad de las variables se define por bloques de código. Puedes definir bloques de código a cualquier nivel, excepto a nivel global. A nivel global necesitas alguna "entidad" a la que pertenezca este bloque. Función, clase, estructura o espacio de nombres.

    Dentro de un bloque "con nombre", puedes poner en cascada tantos bloques como quieras, mientras que la visibilidad es siempre sólo dentro del mismo nivel o bloques incluidos/hijos.

    Las variables estáticas en realidad residen en la memoria del espacio global asignado a un programa, la visibilidad de esta variable se rige por el bloque de código en el que fue declarada/definida. Este también puede ser el espacio global. En realidad, una variable declarada/definida en el espacio global tiene una palabra clave "static" implícita. Mencionarla explícitamente no cambiará nada del comportamiento de esa variable.

    Echo en falta la palabra clave "extern" en tu artículo, así como "input". Creo que estas deberían formar parte.

    De todos modos, creo que es un buen artículo, especialmente para los principiantes, como el concepto de variables es a veces difícil de entender al principio, y un montón de errores se pueden evitar, si se implementa correctamente.

    Tal vez usted continúe con un seguimiento, sería bueno si usted podría incluir sobre la definición, declaración e inicialización de variables, y la memoria. Tal vez también señalar las trampas si no se hace correctamente.

    Y para una mayor comprensión, tal vez algunos detalles sobre la pila, el orden de las variables, MSB vs LSB, direccionamiento de memoria .... Ok, tal vez esto es demasiado lejos de una búsqueda.
     
    Dominik Egert #:

    No estoy de acuerdo en que una directiva de preprocesador pueda mencionarse en el contexto de las variables const.

    La palabra clave const tiene un efecto diferente que #define "constante".

    const puede ser muy útil en firmas de funciones porque pone el valor de los parámetros en modo de sólo lectura. const es una palabra clave creada especialmente para el programador. No tiene representación en el binario ejecutable creado por el compilador.

    A diferencia de la variable const, el operador #define representa un denominado valor r, que en realidad se encuentra en una ubicación de memoria de sólo lectura en un binario ejecutable posterior y, por lo tanto, no puede modificarse en modo alguno.

    Además, #define es una directiva de etapa de preprocesador, y en realidad sólo reemplaza todas las ocurrencias en el archivo fuente. Esto se hace antes de que el compilador vea el código compilado.

    Además, la directiva #define no tiene la misma "ubicación" que una directiva global, puede aparecer en cualquier parte del fichero fuente. En la etapa del preprocesador, el concepto de bloques de código "{...}" no está disponible ni se evalúa.

    La visibilidad de las variables viene determinada por los bloqueos de código. Puede definir los bloqueos de código a cualquier nivel, excepto a nivel global. En el nivel global, necesitas alguna "entidad" a la que pertenezca el bloque. Una función, clase, estructura o espacio de nombres.

    Dentro de ese bloque "con nombre", puede poner en cascada tantos bloques como desee, y la visibilidad siempre será sólo dentro de bloques del mismo nivel o bloques incluidos/subsidiarios.

    Las variables estáticas residen en realidad en el espacio de memoria global asignado al programa; la visibilidad de esta variable viene determinada por el bloque de código en el que se declaró/definió. También puede tratarse de un espacio global. De hecho, una variable declarada/definida en el espacio global lleva implícita la palabra clave "static". Su mención explícita no cambiará en nada el comportamiento de esta variable.

    En tu artículo, echo en falta la palabra clave "extern" así como "input". Creo que deberían formar parte del artículo.

    De todas formas, creo que es un buen artículo, sobre todo para principiantes, ya que el concepto de variables a veces es difícil de entender al principio y se pueden evitar muchos errores si se implementan correctamente.

    Tal vez continúes el artículo, estaría bien que hablaras de la definición, declaración e inicialización de variables, así como de la memoria. Quizás también señale las trampas si se hace incorrectamente.

    Y para una mayor comprensión, tal vez algunos detalles avanzados sobre la pila, ordenación de variables, MSB vs LSB, direccionamiento de memoria..... Vale, quizá sea demasiado lejos.


    Gracias por compartir la información. Intentaré escribir sobre lo que has mencionado tanto como pueda.

     
    Dominik Egert #:
    La palabra clave const tiene un efecto diferente que una "constante" #define.

    Por cierto, me gusta cómo se implementan las constantes en C# (el compilador las sustituye por valores literales).

    https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/constants

    De hecho, cuando el compilador encuentra un identificador constante en el código fuente de C#, sustituye el valor literal directamente en el código de lenguaje intermedio (IL) que produce. Dado que no hay una dirección de variable asociada a una constante en tiempo de ejecución, los campos const no pueden pasarse por referencia y no pueden aparecer como un valor l en una expresión.

    A juzgar por el hecho de que en MQL puedo pasar una constante por referencia, en MQL las constantes siguen siendo variables después de la compilación.