Características da linguagem mql5, subtilezas e técnicas - página 216

 
Igor Makanu #:

ZS: Também já vi macros como

Não percebo.

 
fxsaber #:

Não percebo.

há muita informação online sobre a conveniência de uma tal macro, google "macro while 0".

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

 

Houve um exemplo de enquanto(0) neste fio há muito tempo

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

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.07.30
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 #:
Para que fique claro, é apenas para estática (tudo isto é sobre C++). Para variáveis locais, se houver um utilizador c-tor, não há nulling.

Gostei da explicação em si, que não contradiz de forma alguma o OOP.

Quando se cria um objecto de estrutura simples, acontece o seguinte:

  1. A memória é atribuída à estrutura - qualquer lixo está lá.
  2. O construtor é iniciado nesta peça.

Quando a declaração passa por {}, outra é inserida entre os itens 1-2 - preenchendo a memória atribuída com zeros.


Com esta lógica, o OOP não sofre de forma alguma. É um mecanismo válido.

 
fxsaber #:

    Quando uma declaração é feita com {}, outra é inserida entre as cláusulas 1-2 - preencher a memória atribuída com zeros.

    Com esta lógica, o OOP não sofre de forma alguma. Mecanismo válido.

    A lógica sofre aqui: porque é que precisamos de a zerar se de qualquer forma haverá um construtor?

     
    A100 #:

    A própria lógica sofre aqui: porquê zerar se depois haverá um construtor de qualquer forma?

    Porque uma estrutura com um construtor não pode ser utilizada num sindicato.

     
    Ilyas #:

    Para a união apenas inicializar o primeiro membro, trocar os campos e o teste será executado.
    Pensemos se vale a pena mudar o comportamento para se tornar o que a maioria dos utilizadores espera que seja.

    Considere que eu mudei - agora verifico o 1º termo para x[i].i == 0 (antes a condição 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

    E com ZeroMemory - verdadeiro

     
    Igor Makanu #:

    há muita informação online sobre a conveniência de uma tal macro, google "macro while 0".

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

    Toda esta confusão é apenas para colocar um ponto-e-vírgula no fim de uma macro. Utilizo parênteses encaracolados em macros em todo o lado e não tenho problemas.

     
    A100 #:

    Considere que eu mudei - agora verifico o 1º termo para x[i].i == 0 (anteriormente a condição era x[i].x == 0.0)

    Resultado: falso

    E com ZeroMemory - verdade.

    Sim. bug mql

    (e em C++ retorna verdadeiro).

     
    Como é que agora (b3110) faço para zerar numa estrutura sem complicações?
    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);  
    }