주어진 요소의 배열 지우기 - 페이지 18

 
Vladimir Pastushak :
나는 구조에서 전체 구조가 아니라 필드의 이동이 있다는 것을 알아 냈습니다 ...

아이디어에 대한 간단한 유형의 구조가 작동해야 하는 경우.

 

또 다른 뉘앙스. 알고리즘의 정확성을 증명했습니다. 기능이 실행된 후 출력된 값을 가져왔습니다. 다른 알고리즘이 얼마나 잘 작동하는지는 미스터리로 남아 있습니다.

그러나 체크섬처럼 정확성을 증명합니다.

 
Реter Konow :

추신. 어쨌든 내 결정에 따라 함수를 작성할 때 한 가지 실수를 저질렀습니다.

난 그러면 안돼

어쨌든 감사합니다.

아니요, 제가 실수한 것이 아니라 당신의 실수를 수정했습니다. 당신의 라인이 하는 일에 대해 생각해 보세요. 시도하고 변경하면 알 수 있습니다. 잘못된 체크섬과 잘못된 크기가 있습니다.
 
Реter Konow :


추신. 어쨌든 내 결정에 따라 함수를 작성할 때 한 가지 실수를 저질렀습니다.

난 그러면 안돼


귀하의 코드에서는 동등합니다

 
Nikolai Semko :
아니요, 제가 실수한 것이 아니라 당신의 실수를 수정했습니다. 당신의 라인이 하는 일에 대해 생각해 보세요. 그녀는 아무것도하지 않습니다. 시도하고 변경하면 알 수 있습니다. 잘못된 체크섬과 잘못된 크기가 있습니다.

결과는 정확히 동일합니다. 오류가 없습니다.

예, 아무 것도 하지 않습니다. 그러나 그녀는 더 명확합니다. ))

 
Stanislav Dray :

귀하의 코드에서는 동등합니다

네.

 
Ре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에 의해 제거되었습니다.

그러나 함수는 여전히 계산합니다.