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

 
fxsaber #:

理解できない。ゼロックスは便利なものだから、意味があるんです。

ゼロ化にはZeroMemoryがあり、この ゼロ化は一般に正しく動作しません。以下はその です。

 
A100 #:

ZeroMemoryはゼロ化するためのもので、この ゼロ化は一般に正しく動作しません - 以下に例を 示します。

素晴らしい働きで、私はそれを使っています。

 
fxsaber #:

素晴らしい働き、使っています。

もしそうなら、なぜF5を使ったこの 例はハングアップし、ZeroMemoryを使った場合はハングアップしないのでしょうか?

また{}ではコンパイルされるのに、なぜZeroMemoryでは コンパイルされないのでしょうか?

 
A100 #:

もし素晴らしいなら、なぜこの 例はF5経由ではぶら下がっているのに、ZeroMemory経由ではぶら下がらないのでしょうか?

なぜなら、これもバグのひとつであり、必ず修正されるからです。

そして、なぜここかと いうと、{}ではコンパイルされるのに、ZeroMemoryでは コンパイルされないのです。

この例では{}が機能します。

 
fxsaber #:

この例では{}が機能します。

動作するバグで、それも修正される - そしてコンパイルされない

 
A100 #:

動作するバグで、それも修正される - そしてコンパイルされない

で、何が不満なんだ?速度が重要な場所で{}-機構を使用しない理由はないと思います。

 
fxsaber #:

で、何が不満なんだ?速度が重要な場所で{}-機構を使用しない理由はないと思います。

なぜなら、「素晴らしい」機構が、すでに2つのバグ(!)を抱えているからです。同時に、定評のある代替手段であるZeroMemoryもあり、こちらは(少なくともF5経由では)より高速です。選択は明白である

 
A100 #:

壮大な」メカニズムが、その場ですでに2回もエラーを起こしていることに(!)。

これらのエラーは、戦闘アプリケーションとは関係ありません。

しかし、ZeroMemoryという定評のある代替手段があり、こちらも(少なくともF5経由では)高速です。選択は明白である

以下のエントリーのうち、どのエントリーがより簡潔で論理的であるかは、疑問の余地がないと思います。

int i = 0;

int j;
j = 0;

配列の場合も、それと似たようなものです。

 
fxsaber #:

これらのエラーは、戦闘用とは関係ありません。

以下の中で、どのエントリーがより簡潔で論理的であるかは、疑問の余地がないと思います。

それは、配列でも同じです。

ここで一気に3つ目のエラー(というか他にいくつあるんだ)が発生します(!)。

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

結果:false - すなわち、ゼロ化は行われない(!)。

しかし、ZeroMemoryでは

    X x[10000];      //(*)
    ZeroMemory( x ); //(**)

結果:true - すべて正常 - ゼロ調整完了

もちろん、抽選に参加して、明らかに正しい入力ではなく、冗長な入力(1行以下)をする権利もあります。

 
A100 #:

そしてZeroMemoryで

結果:true - すべてOK - ゼロ調整完了

struct MqlTick2 : private MqlTick {};

void OnStart()
{
  MqlTick2 Ticks[4] = {}; // OK
  
  ZeroMemory(Ticks); // 'Ticks' - not allowed for objects with protected members or inheritance
}
理由: