mql5言語の特徴、微妙なニュアンスとテクニック - ページ 216

 
Igor Makanu #:

ZS: こんなマクロもありましたね。

理解できない。

 
fxsaber #:

理解できない。

このようなマクロの便利さについては、"macro while 0 "でググると、ネット上にたくさん情報があります。

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

 

昔、このスレッドでwhile(0)の例があったのですが

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

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2019.07.30
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 
mktr8591 #:
はっきり言って、静的なものだけです(これはC++の話です)。ローカル変数の場合、ユーザーC-torがあれば、ヌル化は行われない。

OOPと何ら矛盾しない説明自体に好感が持てました。

単純な構造体オブジェクトを作成すると、次のようなことが起こります。

  1. 構造体のためにメモリが確保される - どんなゴミでもそこにある。
  2. このピースでコンストラクタが起動します。

宣言が{}を通過すると、項目1-2の間に別の宣言が挿入され、割り当てられたメモリがゼロで埋め尽くされます。


このロジックでは、OOPは何ら苦にならない。有効な仕組みである。

 
fxsaber #:

    が宣言されると、1-2点の間にもう1つ挿入 され、割り当てられたメモリがゼロで埋め尽くされます。

    このロジックでは、OOPは何ら苦にならない。有効な機構です。

    どうせコンストラクタがあるのに、なぜゼロにする必要があるのでしょうか?

     
    A100 #:

    ロジックそのものに問題があります。どうせコンストラクタがあるのになぜゼロにするのか?

    コンストラクタを持つ構造体はユニオンで使用できないからです。

     
    Ilyas #:

    unionの場合は、最初のメンバーだけを初期化 し、フィールドを入れ替えればテストが実行されます。
    多くのユーザーが期待するものになるように行動を変える価値があるかどうか考えてみよう。

    x[i].i == 0 の第1項をチェックするようにした(以前は 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 );
    }

    結果:false

    そしてZeroMemory - trueで

     
    Igor Makanu #:

    このようなマクロの便利さについては、"macro while 0 "でググると、ネット上にたくさん情報があります。

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

    このような混乱は、マクロの最後にセミコロンを付けるだけのことです。私はマクロの中でどこでも中括弧を使っていますが、問題はありません。

     
    A100 #:

    x[i].i == 0 の第1項をチェックするようにした(以前は x[i].x == 0.0 という条件だった)。

    結果:false

    そしてZeroMemoryで-本当です。

    はい、mqlのバグ

    (C++ではtrueを返す)。

     
    今(b3110)、複雑でない構造をゼロにするにはどうしたらいいのでしょうか?
    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);  
    }
    理由: