定義された要素の配列をクリアする。 - ページ 18

 
Vladimir Pastushak:
わかったんだ、構造全体じゃなくて、構造中のフィールドシフトだったんだ...。

構造が単純なタイプであれば、うまくいくはずです。

 

もうひとつのニュアンス。私のアルゴリズムが正しく動作することを証明しました。関数を実行した後に得られた値をプリントアウトしてみました。他のアルゴリズムがどの程度有効なのかは謎です。

チェックサムは正しいことが証明されているようですが。

 
Реter Konow:

ZS.私の解答に従って関数を書くとき、ひとつだけ間違いがありましたね。

私の機能は

а

でも、とにかくありがとう。

いいえ、私は間違えていません、あなたの間違いを訂正したのです。よく考えて、自分の線はどうなっているのか? 試しに変えてみればわかるはずです。チェックサムもサイズも間違っていることになります。
 
Реter Konow:


ZS.私の解答に従って関数を書くとき、ひとつだけ間違いがありましたね。

私の機能は

а


と同じです。

 
Nikolai Semko:
いいえ、私は間違えていません、あなたの間違いを訂正したのです。よく考えてみてください、あなたのラインは何をしているのか?何もしないから、変えてみればわかるよ。チェックサムもサイズも間違っていることになります。

結果はまったく同じです。エラーはありません。

そう、何もしないのです。でも、それがあればもっと意味があるんです。))

 
Stanislav Dray:

に相当します。

はい。

 
Реter Konow:

はい。

そうそう、ごめんね。

と思い出した。
あなたのコードはここから 引用されました。

あなたのセリフはなかったし、ちゃんと動作させるために追加したあのセリフも覚えていますよ。

タグコノウ

でも、それがあればもっと意味があるんです。))

余計な数学演算が入ってる))

 

質問です。なぜこのコードでは、配列のサイズを変更 した後、変更前と同じように印刷されるのでしょうか?


//+------------------------------------------------------------------+
//|                                             Erase and Resize.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int Arr[20] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2};
   ulong q1 = GetMicrosecondCount(); 
   //--------------------------------
   PeterArray(Arr,3);
   //--------------------------------
   ulong q2 = GetMicrosecondCount();
   //--------------------------------
   Print("Array new size  ",ArraySize(Arr),"  Тime of operation  ",q2-q1);
   ArrayPrint(Arr); 
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int PeterArray(int &Arr[],int val) // вариант Peter Konow
  {
   int deleted=0,q=0;
   for(int a1=0; a1<ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q]=Arr[q+deleted];
      if(Arr[q]==val){deleted++; q--;}
      q++;
     }
   ArrayResize(Arr,ArraySize(Arr) - deleted);
   return (q);
  }
//+------------------------------------------------------------------+

これはチェックサムチェックアルゴリズムの妥当性を問うものである。つまり、チェックサムを計算するときに、以前の要素を保持したまま配列の中をループするのですね。

私流にアルゴリズムを確認することをお勧めします。20個の値からなる配列を出力することで

これは、スピードではなく、正しさのチェックになります。
 
Реter Konow:

質問です。なぜこのコードでは、配列のサイズを変更した後、変更前と同じように印刷されるのでしょうか?


これはチェックサムチェックアルゴリズムの妥当性を問うものである。つまり、チェックサムを計算するときに、以前の要素を保持したまま配列の中をループするのですね。

私流にアルゴリズムを確認することをお勧めします。20個の値からなる配列を出力することで

これは、スピードではなく、正しさのテストになります。
テストでは100万人いるので、100万人を提案します。みんなで座って比べてみよう))
 
Nikolai Semko:
テストでは100万人なので、100万人を提案します。すべて座らせて比較する)))。

チェックサムが正しく計算されていない。

自分で確認する配列の削除された部分に残っている要素を数えます.

//+------------------------------------------------------------------+
//|                                             Erase and Resize.mq5 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link      "https://www.mql5.com"
#property version   "1.00"
//--------------------------------------------------------------------
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int Arr[20] = {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2};
   ulong q1 = GetMicrosecondCount(); 
   //--------------------------------
   PeterArray(Arr,3);
   //--------------------------------
   ulong q2 = GetMicrosecondCount();
   //--------------------------------
   Print("Array new size  ",ArraySize(Arr),"  Тime of operation  ",q2-q1,"  Контрольная сумма: ",ControlSumm(Arr));
   
   ArrayPrint(Arr); 
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int PeterArray(int &Arr[],int val) // вариант Peter Konow
  {
   int deleted=0,q=0;
   for(int a1=0; a1<ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q]=Arr[q+deleted];
      if(Arr[q]==val){deleted++; q--;}
      q++;
     }
   ArrayResize(Arr,ArraySize(Arr) - deleted);
   return (q);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
long ControlSumm(int &a[]) // суммирование всех элементов массива (контрольная сумма)
  {
   long sum=0;
   for(int i=0; i<ArraySize(a); i++) sum+=a[i];
   return sum;
  }
//+------------------------------------------------------------------+

もちろん、まだチェックが間違っているという証拠にはならないが、すでに疑いの余地はある。


チェックサムは、その行の要素から計算される。

2018.11.16 14:36:28.456 Erase and Resize (USDJPY,H1)    1 2 1 2 1 2 1 2 1 2 1 2 1 2 3 1 2 3 1 2

そして、最後の6つの要素は、以前ArrayResizeによって 削除されたものです。

しかし、この機能では、いずれにしてもカウントされます。