Bir diziden bir eleman nasıl kaldırılır (tek boyutlu iki boyutlu)? - sayfa 8

 
Dmitry Fedoseev :

Derlenecek, ancak çok ilginç değil, peki ya z[][][]?

İkinci ve daha yüksek boyutlar dinamik olamaz, ancak işlevin ikinci boyutun belirli boyutuna uyarlanması gerekmez, bunu ArrayRange() aracılığıyla bulabilirsiniz.

Boyut sayısı işlevin aşırı yüklenmesine izin vermiyorsa, ikincisinin boyutu vb. kesinlikle buna izin vermeyecektir. Evet ve bu yüzden tamamen ilginç değil, çünkü hiç de evrensel değil. Farklı fonksiyon isimleri ile yazmak daha kolaydır.

Bu, böyle yazılması gerektiği anlamına mı geliyor?

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

ikinci boyutta 4 element varsa?

 
Alexey Viktorov :

Bu, böyle yazılması gerektiği anlamına mı geliyor?

ikinci boyutta 4 element varsa?

İstersen böyle yaz, kusura bakma.

 

Şu şekilde olacak gibi görünüyor:

 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 :

İstersen böyle yaz, kusura bakma.

Deneme imkanı olmadığı için sordum.

 
Dmitry Fedoseev :

Görünüşe göre şöyle olacak:

O zaman ArrayResize'ın -1'de değil -Count'ta yapılması gerekiyor gibi görünüyor, değil mi?

 
Ilya Malev :

O zaman ArrayResize'ın -1'de değil -Count'ta yapılması gerekiyor gibi görünüyor, değil mi?

Evet. Düzeltildi.

 
Alexey Viktorov :

Deneme imkanı olmadığı için sordum.

Gereksizdir ve aşırı yüklenmeye yardımcı olmaz.

 

Sonra böyle mi?

 #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);}
Doğru, bunun bir öğenin kaldırılması değil, dizinin ilk boyut tarafından kaldırılması olduğunu açıklığa kavuşturmamız gerekiyor ( çok boyutlu bir dizi iletilirse, o zaman tüm "öğeler" ilk boyutun S indeksi tarafından kaldırılır).
 
Dmitry Fedoseev :

Gereksizdir ve aşırı yüklenmeye yardımcı olmaz.

Neden yardım etmeyecek?

Böyle denenmemiş bir seçenek işe yarar mı?

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


İlya'nın versiyonunu gördüm ve boş bir fikir olduğu için kontrol etmedim.

İkinci seçenek yapılarla çalışmaktır. Tek boyutlu bir dizide olduğu gibi bir dizi yapıyla çalışabilirsiniz.

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

Sonuç

 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 :

İlya'nın versiyonunu gördüm ve boş bir fikir olduğu için kontrol etmedim.

Doğru yapmadılar çünkü int &arr[] imzalı bir fonksiyona 1 boyutlu diziden fazlasını geçirmek mümkün olmayacak.