Limpar um conjunto de elementos definidos - página 18

 
Vladimir Pastushak:
Descobri que era a mudança de campo na estrutura, não toda a estrutura.

Se a estrutura for do tipo simples, ela deve funcionar.

 

Outra nuance. Eu provei que meu algoritmo funciona corretamente. Imprimi os valores que recebi depois que a função foi executada. Como funcionam bem os outros algoritmos é um mistério.

Mas o checksum parece estar correto.

 
Реter Konow:

ZS. Você cometeu um erro ao escrever a função de acordo com minha solução, no entanto:

Minha função não é

а

Mas obrigado de qualquer forma.

Não, eu não cometi um erro, corrigi o seu. Pense bem, o que sua linha faz? Basta tentar mudá-la e você verá. Será o checksum errado e o tamanho errado.
 
Реter Konow:


ZS. Você cometeu um erro ao escrever a função de acordo com minha solução, no entanto:

Minha função não é

а


em seu código é o mesmo que

 
Nikolai Semko:
Não, eu não cometi nenhum erro, corrigi o seu. Pense bem, o que sua linha faz? Ele não faz nada. Basta tentar mudá-lo e você verá. Será o checksum errado e o tamanho errado.

O resultado é exatamente o mesmo. Não há erro.

Sim, ele não faz nada. Mas faz mais sentido com ela. ))

 
Stanislav Dray:

em seu código, ele é igual a

Sim.

 
Реter Konow:

Sim.

Ah, sim, desculpe.

Eu me lembrei.
Seu código foi tirado daqui.

Sua linha não estava lá e lembro-me dessa linha que tive de acrescentar para que funcionasse corretamente.

Tag Konow:

Mas faz mais sentido com ela. ))

Há uma operação matemática extra)).

 

Pergunta. Por que neste código, depois de mudar o tamanho da matriz, ela ainda imprime o mesmo que antes da mudança?


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

Isto põe em questão a validade dos algoritmos de verificação do checksum. Então, quando calculamos o checksum, fazemos um loop através da matriz que ainda mantém seus elementos anteriores?

Sugiro verificar os algoritmos à minha maneira. Ao emitir uma matriz de 20 valores.

Esta será uma verificação de exatidão, não de velocidade.
 
Реter Konow:

Pergunta. Por que neste código, depois de mudar o tamanho da matriz, ela ainda imprime o mesmo que antes da mudança?


Isto põe em questão a validade dos algoritmos de verificação do checksum. Então, quando calculamos o checksum, fazemos um loop através da matriz que ainda mantém seus elementos anteriores?

Sugiro verificar os algoritmos à minha maneira. Ao emitir uma matriz de 20 valores.

Este será um teste de exatidão, não de velocidade.
Eu sugiro um milhão, pois há um milhão no teste. Que todos se sentem e comparem)).
 
Nikolai Semko:
Eu sugiro um milhão, já que há um milhão no teste. Que todos se sentem e comparem)))).

O checksum não é calculado corretamente.

Verifique você mesmo. Ele conta os elementos que permanecem na parte eliminada da matriz.

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

É claro que isto ainda não é prova de que o cheque está errado, mas já existe alguma dúvida.


O checksum é calculado a partir dos elementos dessa linha:

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

E os últimos 6 elementos foram anteriormente eliminadospelo ArrayResize.

Mas a função ainda os conta de qualquer maneira.