Caractéristiques du langage mql5, subtilités et techniques - page 216

 
Igor Makanu #:

ZS : J'ai aussi vu des macros comme

Je ne comprends pas.

 
fxsaber #:

Je ne comprends pas.

il y a beaucoup d'informations en ligne sur la commodité d'une telle macro, tapez sur Google "macro while 0".

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

 

Il y avait un exemple de while(0) dans ce fil il y a longtemps.

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

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.07.30
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 #:
Pour être clair, il ne s'agit que de statique (tout ceci concerne le C++). Pour les variables locales, s'il existe un c-tor utilisateur, il n'y a pas de nullité.

J'ai aimé l'explication elle-même, qui ne contredit en rien la POO.

Lorsque vous créez un objet de structure simple, il se passe ce qui suit :

  1. La mémoire est allouée à la structure - tout ce qui est inutile s'y trouve.
  2. Le constructeur est lancé sur cette pièce.

Lorsque la déclaration passe par {}, une autre est insérée entre les éléments 1-2 - remplissant la mémoire allouée de zéros.


Avec cette logique, la POO ne souffre d'aucune façon. C'est un mécanisme valable.

 
fxsaber #:

    Lorsque {} est déclaré, un autre est inséré entre les points 1-2 - remplissant la mémoire allouée de zéros.

    Avec cette logique, la POO ne souffre d'aucune façon. Mécanisme valide.

    La logique souffre ici : pourquoi avons-nous besoin de le mettre à zéro s'il y aura de toute façon un constructeur après ?

     
    A100 #:

    La logique elle-même souffre ici : pourquoi mettre à zéro s'il y aura de toute façon un constructeur par la suite ?

    Parce qu'une structure avec un constructeur ne peut pas être utilisée dans une union.

     
    Ilyas #:

    Pour l'union, il suffit d'initialiser le premier membre, de permuter les champs et le test s'exécutera.
    Réfléchissons si cela vaut la peine de changer de comportement pour devenir ce que la plupart des utilisateurs attendent.

    Considérez que j'ai changé - maintenant je vérifie le 1er terme pour x[i].i == 0 (avant la condition était 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 );
    }

    Résultat : faux

    Et avec ZeroMemory - vrai

     
    Igor Makanu #:

    il y a beaucoup d'informations en ligne sur la commodité d'une telle macro, tapez sur Google "macro while 0".

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

    Tout ce bazar, c'est juste pour mettre un point-virgule à la fin d'une macro. J'utilise partout des crochets dans les macros et je n'ai aucun problème.

     
    A100 #:

    Considérez que j'ai changé - maintenant je vérifie le 1er terme pour x[i].i == 0 (précédemment la condition était x[i].x == 0.0)

    Résultat : faux

    Et avec ZeroMemory - vrai.

    Oui. bug mql

    (et en C++ il renvoie vrai).

     
    Comment puis-je maintenant (b3110) me concentrer sur la structure compliquée ?
    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);  
    }
    Raison: