Borrar una matriz de elementos definidos - página 18

 
Vladimir Pastushak:
Lo he descubierto, era el cambio de campo en la estructura, no toda la estructura...

Si la estructura es de tipo simple, debería funcionar.

 

Otro matiz. He demostrado que mi algoritmo funciona correctamente. Imprimí los valores que obtuve tras la ejecución de la función. El funcionamiento de los demás algoritmos es un misterio.

Sin embargo, la suma de comprobación parece ser correcta.

 
Реter Konow:

ZS. Sin embargo, cometiste un error al escribir la función según mi solución:

Mi función no es

а

Pero gracias de todos modos.

No, no me he equivocado, he corregido el tuyo. Piensa bien, ¿qué hace tu línea? Intenta cambiarla y verás. La suma de comprobación y el tamaño serán incorrectos.
 
Реter Konow:


ZS. Sin embargo, cometiste un error al escribir la función según mi solución:

Mi función no es

а


en su código es lo mismo que

 
Nikolai Semko:
No, no me he equivocado, he corregido el tuyo. Piensa bien, ¿qué hace tu línea? No hace nada. Prueba a cambiarlo y verás. La suma de comprobación y el tamaño serán incorrectos.

El resultado es exactamente el mismo. No hay ningún error.

Sí, no hace nada. Pero tiene más sentido con ella. ))

 
Stanislav Dray:

en su código, es igual a

Sí.

 
Реter Konow:

Sí.

Oh sí, lo siento.

Me acordé.
Su código fue tomado de aquí.

Tu línea no estaba allí y recuerdo que tuve que añadir esa línea para que funcionara correctamente.

Etiqueta Konow:

Pero tiene más sentido con ella. ))

Hay una operación matemática extra en ella. ))

 

Pregunta. ¿Por qué en este código, después de cambiar el tamaño del array, sigue imprimiendo lo mismo que antes del cambio?


//+------------------------------------------------------------------+
//|                                             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);
  }
//+------------------------------------------------------------------+

Esto pone en duda la validez de los algoritmos de comprobación de sumas de verificación. Entonces, cuando calculamos la suma de comprobación, ¿hacemos un bucle a través del array que sigue manteniendo sus elementos anteriores?

Sugiero comprobar los algoritmos a mi manera. Al emitir una matriz de 20 valores.

Esto será una comprobación de la corrección, no de la velocidad.
 
Реter Konow:

Pregunta. ¿Por qué en este código, después de cambiar el tamaño del array, sigue imprimiendo lo mismo que antes del cambio?


Esto pone en duda la validez de los algoritmos de comprobación de sumas de verificación. Entonces, cuando calculamos la suma de comprobación, ¿hacemos un bucle a través del array que sigue manteniendo sus elementos anteriores?

Sugiero comprobar los algoritmos a mi manera. Al emitir una matriz de 20 valores.

Esta será una prueba de corrección, no de velocidad.
Sugiero un millón, ya que hay un millón en la prueba. Que todo el mundo se siente y compare)).
 
Nikolai Semko:
Sugiero un millón, ya que hay un millón en la prueba. Que todos se sienten y comparen)).

La suma de comprobación no se ha calculado correctamente.

Compruébelo usted mismo. Cuenta los elementos que quedan en la parte eliminada del array.

//+------------------------------------------------------------------+
//|                                             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;
  }
//+------------------------------------------------------------------+

Por supuesto, esto no es todavía una prueba de que la comprobación sea errónea, pero ya hay algunas dudas.


La suma de comprobación se calcula a partir de los elementos de esa fila:

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

Y los últimos 6 elementos fueron eliminados previamentepor ArrayResize.

Pero la función sigue contándolos de todos modos.