Características del lenguaje mql5, sutilezas y técnicas - página 216

 
Igor Makanu #:

ZS: También he visto macros como

No lo entiendo.

 
fxsaber #:

No lo entiendo.

hay mucha información en internet sobre la conveniencia de una macro de este tipo, googlea "macro mientras 0"

https://russianblogs.com/article/9410298326/

 

Hubo un ejemplo de while(0) en este hilo hace mucho tiempo

https://www.mql5.com/ru/forum/170952/page141#comment_12897922

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.07.30
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 #:
Para que quede claro, es sólo para estática (todo esto es sobre C++). Para las variables locales, si hay un c-tor de usuario, no hay anulación.

Me ha gustado la explicación en sí, que no contradice en absoluto a la OOP.

Cuando se crea un objeto de estructura simple, ocurre lo siguiente:

  1. La memoria se asigna para la estructura - cualquier basura está allí.
  2. El constructor se inicia en esta pieza.

Cuando la declaración pasa por {}, se inserta otra entre los elementos 1-2 - llenando la memoria asignada con ceros.


Con esta lógica, la POO no se resiente en absoluto. Es un mecanismo válido.

 
fxsaber #:

    Cuando se declara {}, se inserta otro entre los puntos 1-2 - llenando la memoria asignada con ceros.

    Con esta lógica, la POO no se resiente en absoluto. Mecanismo válido.

    La lógica se resiente aquí: ¿por qué necesitamos ponerlo a cero si después habrá un constructor de todas formas?

     
    A100 #:

    La propia lógica se resiente aquí: ¿por qué poner a cero si después habrá un constructor de todos modos?

    Porque una estructura con un constructor no puede ser utilizada en una unión.

     
    Ilyas #:

    Para la unión sólo inicializa el primer miembro, intercambia los campos y la prueba se ejecutará.
    Pensemos si vale la pena cambiar el comportamiento para convertirse en lo que la mayoría de los usuarios esperan.

    Considera que he cambiado - ahora compruebo el primer término para x[i].i == 0 (antes la condición era x[i].x == 0.0)

    union X {
        int i;
        double x;
    };
    void OnStart()
    {
        X x[10000] = {}; //(*)
        bool b = true;
        for ( int i = 0; i < ArraySize(x) && (b = (x[i].i == 0)); i++ );
        Print( b );
    }

    Resultado: falso

    Y con ZeroMemory - true

     
    Igor Makanu #:

    hay mucha información en internet sobre la conveniencia de una macro de este tipo, googlea "macro mientras 0"

    https://russianblogs.com/article/9410298326/

    Todo este lío es sólo para poner un punto y coma al final de una macro. Yo uso llaves en todas las macros y no tengo problemas.

     
    A100 #:

    Considera que he cambiado - ahora compruebo el primer término para x[i].i == 0 (antes la condición era x[i].x == 0.0)

    Resultado: falso

    Y con ZeroMemory - verdadero.

    Sí. Error de mql

    (y en C++ devuelve true).

     
    ¿Cómo puedo ahora (b3110) poner a cero una estructura no complicada?
    struct MqlTick2 : private MqlTick
    {
    //  string Str; // С этой строкой не обнулить.
    };
    
    
    template <typename T>
    void ZeroMemoryStruct( T &Struct )
    {
      uchar Bytes[sizeof(T)];
      
      ::CharArrayToStruct(Struct, Bytes);
    }
    
    void OnStart()
    {
      MqlTick2 Tick;
    
      ZeroMemoryStruct(Tick);  
    }
    Razón de la queja: