배열(1차원 2차원)에서 요소를 제거하는 방법은 무엇입니까? - 페이지 8

 
Dmitry Fedoseev :

컴파일되지만 그다지 흥미롭지 않습니다. z[][][]는 어떻습니까?

두 번째 이상의 차원은 동적일 수 없지만 함수는 두 번째 차원의 특정 크기에 맞게 조정할 필요가 없습니다. ArrayRange()를 통해 찾을 수 있습니다.

차원 수가 함수 오버로드를 허용하지 않으면 두 번째 차원 등의 크기는 절대 허용하지 않습니다. 예, 그래서 그것은 전혀 보편적이지 않기 때문에 완전히 흥미롭지 않습니다. 다른 함수 이름으로 작성하는 것이 더 쉽습니다.

이렇게 써야 한다는 뜻인가요?

 void z( int size_second_dimension, int & z[] [ 4 ] , int shift){};

2차원에 4개의 요소가 있다면?

 
Alexey Viktorov :

이렇게 써야 한다는 뜻인가요?

2차원에 4개의 요소가 있다면?

원한다면 이렇게 써도 상관없어요.

 

다음과 같이 될 것 같습니다.

 void z4( int & a[][][][], int Start, int Count= 1 ){
   int n= ArrayRange (a, 1 )* ArrayRange (a, 2 )* ArrayRange (a, 3 );
   ArrayCopy (a,a,Start*n,(Start+Count)*n);
   ArrayResize (a, ArrayRange (a, 0 )-Count);
};
 void z3( int & a[][][], int Start, int Count= 1 ){
   int n= ArrayRange (a, 1 )* ArrayRange (a, 2 );
   ArrayCopy (a,a,Start*n,(Start+Count)*n);
   ArrayResize (a, ArrayRange (a, 0 )-Count);
};
 void z2( int & a[][], int Start, int Count= 1 ){
   int n= ArrayRange (a, 1 );
   ArrayCopy (a,a,Start*n,(Start+Count)*n);
   ArrayResize (a, ArrayRange (a, 0 )-Count);
};
 void z1( int & a[], int Start, int Count= 1 ){
   ArrayCopy (a,a,Start,Start+Count);
   ArrayResize (a, ArrayRange (a, 0 )-Count);
};
 
Dmitry Fedoseev :

원한다면 이렇게 써도 상관없어요.

실험할 기회가 없어서 물어봤다.

 
Dmitry Fedoseev :

다음과 같이 될 것 같습니다.

그러면 ArrayResize가 -1이 아니라 -Count 에서 수행되어야 하는 것 같습니까?

 
Ilya Malev :

그러면 ArrayResize가 -1이 아닌 -Count에서 수행되어야 하는 것 같죠?

응. 수정했습니다.

 
Alexey Viktorov :

실험할 기회가 없어서 물어봤다.

불필요하며 과부하에 도움이 되지 않습니다.

 

그럼 이렇게?

 #define ArrayDel(A,S,C) { int n= fmax ( 1 , ArrayRange (A, 3 ))* fmax ( 1 , ArrayRange (A, 2 ))* fmax ( 1 , ArrayRange (A, 1 )); \
                               ArrayCopy (A,A,S*n,(S+C)*n); ArrayResize (A, ArrayRange (A, 0 )-C);}
사실, 이것이 요소의 제거가 아니라 첫 번째 차원에 의한 인덱스 제거임을 명확히 해야 합니다( 다차원 배열 이 전달되면 모든 "요소"는 첫 번째 차원의 인덱스 S에 의해 제거됨).
 
Dmitry Fedoseev :

불필요하며 과부하에 도움이 되지 않습니다.

도움이 되지 않는 이유는 무엇입니까?

이러한 테스트되지 않은 옵션이 작동합니까?

 class CDellArrayElement
  {
public :
   void DellArrayElement( int &arr[], int Start, int Count= 1 );
   void DellArrayElement( int &arr[][], int size_1_dimension, int Start, int Count= 1 );
   void DellArrayElement( int &arr[][][], int size_1_dimension, int size_2_dimension, int Start, int Count= 1 );
   void DellArrayElement( int &arr[][][][], int size_1_dimension, int size_2_dimension, int size_3_dimension, int Start, int Count= 1 );
  };

//+------------------------------------------------------------------+
//|            Одномерный массив                                     |
//+------------------------------------------------------------------+
void CDellArrayElement::DellArrayElement( int &arr[], int Start, int Count= 1 )
{
 ArrayCopy (arr, arr, Start, Start+Count);
 ArrayResize (arr, ArrayRange (arr, 0 )-Count);
};
//+------------------------------------------------------------------+
//|            Двухмерный массив                                     |
//+------------------------------------------------------------------+
void CDellArrayElement::DellArrayElement( int &arr[][], int size_1_dimension, int Start, int Count= 1 )
{
 ArrayCopy (arr, arr, Start*size_1_dimension, (Start+Count)*size_1_dimension);
 ArrayResize (arr, ArrayRange (arr, 0 )-Count);
};
//+------------------------------------------------------------------+
//|            Трёхмерный массив                                     |
//+------------------------------------------------------------------+
void CDellArrayElement::DellArrayElement( int &arr[][][], int size_1_dimension, int size_2_dimension, int Start, int Count= 1 )
{
 int n = size_1_dimension*size_2_dimension;
 ArrayCopy (arr,arr, Start*n, (Start+Count)*n);
 ArrayResize (arr, ArrayRange (arr, 0 )-Count);
};
//+------------------------------------------------------------------+
//|            Четырёхмерный массив                                  |
//+------------------------------------------------------------------+
void CDellArrayElement::DellArrayElement( int &arr[][][][], int size_1_dimension, int size_2_dimension, int size_3_dimension, int Start, int Count= 1 )
{
 int n = size_1_dimension*size_2_dimension*size_3_dimension;
 ArrayCopy (arr, arr, Start*n, (Start+Count)*n);
 ArrayResize (arr, ArrayRange (arr, 0 )-Count);
};


일리야의 버전을 보고 공허한 생각이었기에 확인을 하지 않았다.

두 번째 옵션은 구조로 작업하는 것입니다. 1차원 배열과 마찬가지로 구조 배열로 작업할 수 있습니다.

 struct a
{
 int b;
 double c;
 datetime d;
}array[];

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnStart ()
  {
//---
   ArrayResize (array, 6 );
   double op[];
     CopyOpen ( _Symbol , PERIOD_CURRENT , 0 , 6 , op);
   datetime ti[];
     CopyTime ( _Symbol , PERIOD_CURRENT , 0 , 6 , ti);
   for ( int i = 0 ; i < 6 ; i++)
    {
     array[i].b = i;
     array[i].c = op[i];
     array[i].d = ti[i];
    }
   ArrayPrint (array);
 ArrayCopy (array, array, 4 , 5 );
 ArrayResize (array, 5 );
   ArrayPrint (array);
//---
  }

결과

 2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)            [b]     [c]                 [d]
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 0 ]   0 1.14110 2018.12 . 24 12 : 30 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 1 ]   1 1.14096 2018.12 . 24 12 : 35 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 2 ]   2 1.14079 2018.12 . 24 12 : 40 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 3 ]   3 1.14064 2018.12 . 24 12 : 45 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 4 ]   4 1.14069 2018.12 . 24 12 : 50 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 5 ]   5 1.14036 2018.12 . 24 12 : 55 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)            [b]     [c]                 [d]
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 0 ]   0 1.14110 2018.12 . 24 12 : 30 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 1 ]   1 1.14096 2018.12 . 24 12 : 35 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 2 ]   2 1.14079 2018.12 . 24 12 : 40 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 3 ]   3 1.14064 2018.12 . 24 12 : 45 : 00
2018.12 . 24 13 : 55 : 20.336 TestDellArrayElement (EURUSD,M5)        [ 4 ]   5 1.14036 2018.12 . 24 12 : 55 : 00
 
Alexey Viktorov :

일리야의 버전을 보고 공허한 생각이었기에 확인을 하지 않았다.

int &arr[] 서명이 있는 함수 에 1차원 배열 이상 을 전달할 수 없기 때문에 제대로 하지 않았습니다.