Очистка массива от заданного (ых) элементов - страница 18

 
Vladimir Pastushak:
Разобрался, в струтуре происходило смещение поля а не всей структуры...

Если структуры простых типов, то по идеи должно работать.

 

Еще нюанс. Я доказал правильность работы своего алгоритма. Вывел через принт значения которые получились после выполнения функции. Насколько правильно работают остальные алгоритмы, остается загадкой.

Хотя, вроде контрольная сумма доказывает правильность. 

 
Реter Konow:

ЗЫ. Все таки одну ошибку при написании функции по моему решению ты допустил:

У меня стоит не 

а

Но, все равно спасибо.

Нет, я не допустил ошибку,  а исправил твою. Хорошо подумай, что делает твоя строчка?   Просто попробуй и поменяй, и увидишь. Будет не та контрольная сумма и не тот размер.
 
Реter Konow:


ЗЫ. Все таки одну ошибку при написании функции по моему решению ты допустил:

У меня стоит не 

а


в вашем коде это равнозначно

 
Nikolai Semko:
Нет, я не допустил ошибку,  а исправил твою. Хорошо подумай, что делает твоя строчка? Она ничего не делает.  Просто попробуй и поменяй, и увидишь. Будет не та контрольная сумма и не тот размер.

Результат точно такой же. Ошибки нет.

Да, не делает ничего. Но с ней понятнее. ))

 
Stanislav Dray:

в вашем коде это равнозначно

Да.

 
Реter Konow:

Да.

А да, сорри. 

Вспомнил. 
Твой код брал отсюда

Там не было твоей строчки и помню, эту строчку мне пришлось добавить, чтобы правильно работало.

Реter 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

Но функция все равно их считает.