配列(1次元2次元)から要素を削除するにはどうすればよいですか? - ページ 8

 
Dmitry Fedoseev:

コンパイルはできるけど、面白くないし、z[][]はどうするの?

2次元目以上は動的にはできませんが、2次元目の特定のサイズに合わせて関数をカスタマイズする必要はなく、ArrayRange()で知ることができます。

もし、測定値の数が関数をオーバーロードすることを許さないのであれば、2番目とその他の測定値のサイズは確実にオーバーロードしません。その上、全く普遍性がないので、全く面白くない。違う名前の関数を書けば、もっと簡単になるはずです。

こう書くべきだということですか?

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);}
確かに、これは1次元によるインデックスを削除するのであって、要素を削除するのではないことを明確にする必要があります(多次元配列が 渡された場合、1次元の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);
};


イリヤの変種を見たけど、空手形だから確認したくなかったんだ。

2つ目は、構造物の扱い方です。構造体の配列は、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次元以上の 配列を渡すことはできないので、その通りです。