将开放的职位分成若干组 - 页 4

 
Alexey Viktorov:

将数组 "复制到自身",从要删除的数组旁边的位置开始,从要删除的数组开始写入。然后按照Grigori.S.B的建议调整大小

有趣的是,如果我没有理解错的话,你需要使用这个功能吗?

int  ArrayCopy( 
   void&        dst_array[],         // куда копируем 
   const void&  src_array[],         // откуда копируем 
   int          dst_start=0,         // с какого индекса пишем в приемник 
   int          src_start=0,         // с какого индекса копируем из источника 
   int          count=WHOLE_ARRAY    // сколько элементов 
   );
 
Sergey Voytsekhovsky:

早上好,谢谢你的答复。

我想你还没有注意到,你可以看看上面,所有的问题都是关于MQL5的。

我明白,这种差别有时并不关键,但尽管如此。你所引用的函数调整了数组的大小,也许在大小减少的情况下切断了多余的元素。

这不是我们所需要的。你需要通过找到一个元素的值来删除它。我也试过这个功能,我在#23中写过。还是谢谢你。

我也没有注意到这一点。mql5有ArrayRemove功能,没有问题。

 

在这种情况下,ArrayRemove 更合适,手册中有一个例子,它的工作原理完全是这样

//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- объявим массив фиксированного размера и заполним значениями 
   int array[10]; 
   for(int i=0;i<10;i++) 
     { 
      array[i]=i; 
     } 
//--- покажем массив до удаления элементов 
   Print("До вызова ArrayRemove()"); 
   ArrayPrint(array); 
//--- удалим 2 элемента из массива и покажем новый состав 
   ArrayRemove(array,4,2); 
   Print("После вызова ArrayRemove()"); 
   ArrayPrint(array); 
/* 
   Результат выполнения:  
   До вызова ArrayRemove() 
   0 1 2 3 4 5 6 7 8 9 
   После вызова ArrayRemove() 
   0 1 2 3 6 7 8 9 8 9 
*/

唯一的问题是,这些例子和函数是为一维数组设计的,而它们不想与二维数组一起工作。

我想我错过了一些非常重要和基本的东西。但它是什么呢?

我告诉你,我已经失去了参考书。

 
Sergey Voytsekhovsky:

在这种情况下,ArrayRemove 更合适,手册中有一个例子,它的工作原理完全是这样

唯一的问题是,这些例子和函数是为一维数组设计的,而它们不想与二维数组一起工作。

我想我错过了一些非常重要和基本的东西。但它是什么呢?

我告诉你,我已经记不清楚了。

顺序很重要吗?
从最后一个位置复制到要删除的位置,调整阵列的大小
 
Alexey Viktorov:
对于一个二维数组,你需要把要删除的行数乘以2。对于一个3维的数组,乘以3...

我不太明白,请你详细说明一下,或者最好给我看看我的一段代码的编辑情况,我在上面贴了。如果不方便,那么不管怎样,我都会想办法解决的。

 
Aliaksandr Hryshyn:
顺序很重要吗?
你从最后一个位置复制到要删除的位置,调整阵列的大小。

不,顺序并不重要,你只需要删除一个已知的(通过知识发现,索引是已知的)条目。ArrayRemove 很好,一切都会很好,但如何将这个函数应用于二维数组? 手册中没有提到。

 
Sergey Voytsekhovsky:

不,顺序并不重要,我们只需要删除一个已知的(通过认知找到的,索引是已知的)记录。ArrayRemove很好,一切都会很好,但是如何将这个函数应用于二维数组呢? 手册中没有关于这个的内容。

所以就像我说的,只有第二维的数组被复制了。
调整一个数组的大小时,也要指定第三个参数,例如32。
 
Sergey Voytsekhovsky:

在这种情况下,ArrayRemove 更合适,手册中有一个例子,它的工作原理完全是这样

唯一的问题是,这些例子和函数是为一维数组设计的,而它们不想与二维数组一起工作。

我想我错过了一些非常重要和基本的东西。但它是什么呢?

我告诉你,我已经失去了参考书。

那是胡说八道。我没有看手册就使用了这个功能。在调试器中,我看到该元素被删除,数组的大小瞬间减少。我检查过了,它甚至在有结构数组的情况下也能工作,没有任何问题。现在我不能用代码工作,只能用文字:例如,我想从一个二维数组中删除第三个索引。事实证明,第五和第六个值必须被删除。在复制时,该函数,HOWEVER,将所有的值排列成一个一维数组,结果发现第三对值从索引5开始。一般来说,这在几次实验后就会有所领悟。

至于ArrayRemove,当我可以时,我会在2-4维的数组上测试它因为不需要,我从来没有测试过,也没有怀疑它不起作用。


已添加。

已检查。不要忘记,你不能调整静态数组的大小。这就是为什么在文档中的例子中,数组的大小保持不变,最后两个字符串被重复。当你从一个动态数组 中删除行时,大小的变化没有任何问题。

手册应擦拭到显示器中的孔:))))。

/********************Script program start function*******************/
void OnStart()
 {
  double arrTest[][ 2];
  for(int i = 0; i < 10; i++)
   {
    ArrayResize(arrTest, i+1);
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);
   }
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
    ArrayRemove(arrTest, 3, 2);
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
         );
 }/******************************************************************/
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 20
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16525 1.16876
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16467 1.16525
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [8,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [9,] 1.15447 1.16156
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 16
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15447 1.16156

下面是3维数组和结果。

2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 30
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 3.00000 1.16525 1.16876
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 4.00000 1.16467 1.16525
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [8,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [9,] 9.00000 1.15447 1.16156
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 24
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 9.00000 1.15447 1.16156
 
Alexey Viktorov:

那是垃圾。我没有看手册就使用了这个功能。在调试器中,我看到了元素被删除,数组的大小被瞬间缩小。经检查,即使在一个数组结构上工作也没有问题。现在我不能用代码工作,只能用文字:例如,我想从一个二维数组中删除第三个索引。事实证明,第五和第六个值必须被删除。在复制时,该函数,HOWEVER,将所有的值排列成一个一维数组,结果发现第三对从索引5开始。一般来说,这在几次实验后就会有所领悟。

至于ArrayRemove,当我可以时,我会在2-4维的数组上测试它因为不需要,我从来没有测试过,也没有怀疑它不起作用。


已添加。

已检查。不要忘记,你不能调整静态数组的大小。这就是为什么在文档中的例子中,数组的大小保持不变,最后两个字符串被重复。当你从一个动态数组 中删除行时,大小的变化没有任何问题。

该目录必须被刷到显示器中的孔:))))。

这里我做了一个3维数组,结果是什么?

你的例子非常慢,如果有大量的值,这将是很明显的。
 
Aliaksandr Hryshyn:
你的例子非常慢,如果有大量的值,这将是很明显的。

用大量的什么?阵列元素 甚至没有在每次勾选时被填充?它将如何被注意到?