Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 216

 
Igor Makanu #:

ZS: Ho anche visto macro come

Non capisco.

 
fxsaber #:

Non capisco.

c'è un sacco di informazioni online sulla convenienza di una tale macro, cercate su google "macro while 0"

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

 

C'era un esempio di while(0) in questo thread molto tempo fa

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

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.07.30
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 #:
Per essere chiari, è solo per la statica (tutto questo riguarda il C++). Per le variabili locali, se c'è un c-tor dell'utente, non c'è nullità.

Mi è piaciuta la spiegazione in sé, che non contraddice in alcun modo l'OOP.

Quando si crea un oggetto struttura semplice, succede quanto segue:

  1. La memoria è allocata per la struttura - qualsiasi spazzatura è lì.
  2. Il costruttore viene avviato su questo pezzo.

Quando la dichiarazione passa attraverso {}, un altro viene inserito tra gli elementi 1-2 - riempiendo la memoria allocata di zeri.


Con questa logica, l'OOP non soffre in alcun modo. È un meccanismo valido.

 
fxsaber #:

    Quando {} viene dichiarato, un altro viene inserito tra i punti 1-2 - riempiendo la memoria allocata di zeri.

    Con questa logica, l'OOP non soffre in alcun modo. Meccanismo valido.

    La logica soffre qui: perché abbiamo bisogno di azzerarlo se dopo ci sarà comunque un costruttore?

     
    A100 #:

    La logica stessa soffre qui: perché azzerare se dopo ci sarà comunque un costruttore?

    Perché una struttura con un costruttore non può essere usata in un'unione.

     
    Ilyas #:

    Per l'unione inizializzate solo il primo membro, scambiate i campi e il test verrà eseguito.
    Pensiamo se vale la pena di cambiare il comportamento per diventare quello che la maggior parte degli utenti si aspetta.

    Considerate che ho cambiato - ora controllo il 1° termine per x[i].i == 0 (prima la condizione 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 );
    }

    Risultato: falso

    E con ZeroMemory - vero

     
    Igor Makanu #:

    c'è un sacco di informazioni online sulla convenienza di una tale macro, cercate su google "macro while 0"

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

    Tutto questo casino è solo per mettere un punto e virgola alla fine di una macro. Io uso le parentesi graffe nelle macro ovunque e non ho problemi.

     
    A100 #:

    Considerate che ho cambiato - ora controllo il 1° termine per x[i].i == 0 (prima la condizione era x[i].x == 0.0)

    Risultato: falso

    E con ZeroMemory - vero.

    Sì. mql bug

    (e in C++ restituisce true).

     
    Come faccio ora (b3110) ad azzerare una struttura non complicata?
    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);  
    }
    Motivazione: