清除一个定义元素的数组 - 页 18

 
Vladimir Pastushak:
我想明白了,是结构中的场转移,而不是整个结构......

如果该结构是一个简单的类型,它应该可以工作。

 

另一个细微差别。我已经证明了我的算法是正确工作的。我打印出了函数执行后得到的数值。其他算法的工作效果如何是个谜。

不过校验和似乎证明是正确的。

 
Реter Konow:

ZS,不过你在按照我的方案写函数时确实犯了一个错误。

我的功能不是

а

但还是要谢谢你。

不,我没有犯错,我纠正了你的错误。好好想想,你的线路是做什么的? 只要试着改变它,你就会明白。它将是错误的校验和和错误的大小。
 
Реter Konow:


ZS,不过你在按照我的方案写函数时确实犯了一个错误。

我的功能不是

а


在你的代码中,它与

 
Nikolai Semko:
不,我没有犯错,我纠正了你的错误。好好想想,你的生产线是做什么的?它不做任何事情。 只要试着改变它,你就会发现。它将是错误的校验和和错误的大小。

其结果是完全一样的。没有错误。

是的,它没有做任何事情。但有了它就更有意义了。))

 
Stanislav Dray:

在你的代码中,它等同于

是的。

 
Реter Konow:

是的。

哦,是的,对不起。

我想起来了。
你的代码取自这里

你的那句话不在那里,我记得那句话我必须加上去才能正常工作。

标签 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个值的数组。

这将是对正确性的测试,而不是速度。
我建议是一百万,因为测试中有一百万。让大家坐下来比较一下。))。
 
Nikolai Semko:
我建议是一百万,因为有一百万在测试。让大家坐下来比较一下))。

校验和计算不正确。

自己检查一下吧。它计算保留在数组删除部分的元素。

//+------------------------------------------------------------------+
//|                                             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 删除

但无论如何,该函数仍然计算它们。