Dividir las posiciones abiertas en grupos - página 4

 
Alexey Viktorov:

Copiar el array "en sí mismo", comenzando en la posición siguiente a la que se va a borrar y escribiendo desde la que se va a borrar. Y luego cambiar el tamaño como Grigori.S.B sugirió

Curiosamente, si he entendido bien, ¿es necesario utilizar esta función?

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

Buenos días, gracias por su respuesta.

Supongo que no te has dado cuenta, puedes mirar arriba, todas las preguntas eran sobre MQL5.

Entiendo que la diferencia no es crucial a veces, pero sin embargo. La función que has citado redimensiona el array, tal vez cortando elementos extra si se reduce el tamaño.

Esto no es lo que se necesita. Para eliminar un elemento hay que buscarlo por su valor. Yo también probé esta función, escribí sobre ella en el #23. Gracias de todos modos.

Yo también no le he prestado atención. mql5 tiene la función ArrayRemove y no hay problemas.

 

En este casoArrayRemove es más adecuado, hay un ejemplo en el manual, funciona exactamente igual

//| 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 
*/

El único problema es que estos ejemplos y funciones están diseñados para matrices unidimensionales, y no quieren trabajar con matrices bidimensionales.

Creo que me falta algo muy importante y fundamental. ¿Pero qué es?

Te digo que ya he perdido el libro de referencia.

 
Sergey Voytsekhovsky:

En este casoArrayRemove es más adecuado, hay un ejemplo en el manual, funciona exactamente así

El único problema es que estos ejemplos y funciones están diseñados para matrices unidimensionales, y no quieren trabajar con matrices bidimensionales.

Creo que me falta algo muy importante y fundamental. ¿Pero qué es?

Te digo que ya le he perdido la pista.

¿Es importante el orden?
Copiar desde la última posición a la que se va a borrar, redimensionar el array.
 
Alexey Viktorov:
En el caso de un array bidimensional, hay que multiplicar por 2 el número de línea para el borrado. Para una matriz tridimensional multiplica por 3...

No entiendo muy bien esto, ¿podrías explicarlo con más detalle, o mejor aún, mostrarme la edición en un trozo de mi código, lo he puesto arriba. Si es un inconveniente, pues da igual, ya lo resolveré de alguna manera.

 
Aliaksandr Hryshyn:
¿Es importante el orden?
Se copia desde la última posición hasta la que se va a borrar, se redimensiona el array.

No, el orden no es importante, sólo hay que eliminar una entrada conocida (encontrada por el conocimiento, el índice es conocido). Puede estar en cualquier parte del array (al principio, en medio, al final).ArrayRemove está muy bien, todo estaría bien, pero ¿cómo aplicar esta función a un array bidimensional? el manual no dice nada al respecto.

 
Sergey Voytsekhovsky:

No, el orden no es importante, sólo necesitamos eliminar un registro conocido (encontrado por la cognición, el índice es conocido). Puede estar en cualquier parte del array (al principio, en el medio, al final).ArrayRemove está muy bien, todo estaría bien, pero ¿cómo aplicar esta función a un array bidimensional? No hay nada en el manual al respecto.

Así que haz lo que he dicho, sólo se copia el array de la segunda dimensión.
Al redimensionar un array, especifique también un tercer parámetro, por ejemplo, 32.
 
Sergey Voytsekhovsky:

En este casoArrayRemove es más adecuado, hay un ejemplo en el manual, funciona exactamente así

El único problema es que estos ejemplos y funciones están diseñados para matrices unidimensionales, y no quieren trabajar con matrices bidimensionales.

Creo que me falta algo muy importante y fundamental. ¿Pero qué es?

Te digo que he perdido el libro de referencia.

Eso es una tontería. He utilizado esta función sin leer el manual. En el depurador he visto cómo se borraba el elemento y el tamaño del array se reducía instantáneamente. Lo he comprobado, funciona incluso con un array de estructuras sin problemas. Ahora no puedo trabajar con el código, sino sólo con palabras: Por ejemplo, quiero borrar el 3er índice de un array de 2 dimensiones. Resulta que hay que eliminar los valores quinto y sexto. Al copiar, la función, SIN EMBARGO, ordena todos los valores en una matriz unidimensional y resulta que el tercer par comienza con el índice 5. Por lo general, se llega a la conclusión después de algunos experimentos.

En cuanto a ArrayRemove cuando pueda lo probaré en arrays de 2 a 4 dimensiones. Por falta de necesidad nunca lo he probado y no sospechaba que no funcionara.


Añadido:

Comprobado. No olvides que no puedes redimensionar un array estático. Por eso, en el ejemplo de la documentación el tamaño del array sigue siendo el mismo y las dos últimas cadenas se repiten. Cuando se eliminan filas de un array dinámico, el tamaño cambia sin problemas.

El manual debe ser fregado hasta los agujeros:)))) en el monitor.

/********************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

Aquí está la matriz tridimensional y el resultado:

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:

Eso es una tontería. He utilizado esta función sin leer el manual. En el depurador he visto como se borra un elemento y el tamaño del array se reduce instantáneamente. Comprobado, incluso en una matriz de estructuras funciona sin problemas. Ahora no puedo trabajar con el código, sino sólo con palabras: Por ejemplo, quiero borrar el 3er índice de un array de 2 dimensiones. Resulta que hay que eliminar los valores quinto y sexto. Al copiar, la función, SIN EMBARGO, ordena todos los valores en una matriz unidimensional y resulta que el tercer par comienza con el índice 5. Por lo general, se llega a la conclusión después de algunos experimentos.

En cuanto a ArrayRemove cuando pueda lo probaré en arrays de 2 a 4 dimensiones. Por falta de necesidad nunca lo he probado y no sospechaba que no funcionara.


Añadido:

Comprobado. No olvides que no puedes redimensionar un array estático. Por eso, en el ejemplo de la documentación el tamaño del array sigue siendo el mismo y las dos últimas cadenas se repiten. Cuando se eliminan filas de un array dinámico, el tamaño cambia sin problemas.

El directorio tiene que ser fregado a los agujeros:)))) en el monitor.

Aquí he hecho un array de 3 dimensiones y el resultado:

Tu ejemplo es muy lento, con un gran número de valores esto se notará.
 
Aliaksandr Hryshyn:
Tu ejemplo es muy lento, con un gran número de valores esto se notará.

¿Con un montón de qué? ¿Elementos de la matriz que ni siquiera se llenan en cada tic? ¿Cómo se notará?