配列(1次元2次元)から要素を削除するにはどうすればよいですか? - ページ 8 123456789 新しいコメント Alexey Viktorov 2018.12.24 08:26 #71 Dmitry Fedoseev:コンパイルはできるけど、面白くないし、z[][]はどうするの? 2次元目以上は動的にはできませんが、2次元目の特定のサイズに合わせて関数をカスタマイズする必要はなく、ArrayRange()で知ることができます。 もし、測定値の数が関数をオーバーロードすることを許さないのであれば、2番目とその他の測定値のサイズは確実にオーバーロードしません。その上、全く普遍性がないので、全く面白くない。違う名前の関数を書けば、もっと簡単になるはずです。こう書くべきだということですか? void z(int size_second_dimension,int & z[][4],int shift){}; 2次元に4つの要素がある場合? Dmitry Fedoseev 2018.12.24 08:49 #72 Alexey Viktorov:こう書くべきだということですか? 2次元に4つの要素がある場合?そう書きたいならそう書けばいい、気にしない。 Dmitry Fedoseev 2018.12.24 09:32 #73 そういうことになりますね。 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); }; Alexey Viktorov 2018.12.24 09:39 #74 Dmitry Fedoseev:好きなように書けばいい、気にしない。実験する機会がないので聞いてみました。 Ilya Malev 2018.12.24 09:55 #75 Dmitry Fedoseev:という感じですね。そうすると、ArrayResizeは-1ではなく、-Countに設定する必要がありますね? Dmitry Fedoseev 2018.12.24 09:58 #76 Ilya Malev:そうすると、ArrayResizeは-1ではなく、-Countに設定する必要がありますね?ええ、訂正します。 Dmitry Fedoseev 2018.12.24 09:59 #77 Alexey Viktorov:実験する機会がないので聞いてみました。必要ありませんし、過負荷には役立ちません。 Ilya Malev 2018.12.24 10:04 #78 じゃあ、こんな感じ? #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インデックスによるすべての「要素」が削除されます)。 Alexey Viktorov 2018.12.24 11:01 #79 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 Ilya Malev 2018.12.24 11:10 #80 Alexey Viktorov:イリヤの変種を見たが、空手形なので確認しなかった。 int &arr[] シグネチャを持つ関数に 1次元以上の 配列を渡すことはできないので、その通りです。 123456789 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
コンパイルはできるけど、面白くないし、z[][]はどうするの?
2次元目以上は動的にはできませんが、2次元目の特定のサイズに合わせて関数をカスタマイズする必要はなく、ArrayRange()で知ることができます。
もし、測定値の数が関数をオーバーロードすることを許さないのであれば、2番目とその他の測定値のサイズは確実にオーバーロードしません。その上、全く普遍性がないので、全く面白くない。違う名前の関数を書けば、もっと簡単になるはずです。
こう書くべきだということですか?
2次元に4つの要素がある場合?
こう書くべきだということですか?
2次元に4つの要素がある場合?
そう書きたいならそう書けばいい、気にしない。
そういうことになりますね。
好きなように書けばいい、気にしない。
実験する機会がないので聞いてみました。
という感じですね。
そうすると、ArrayResizeは-1ではなく、-Countに設定する必要がありますね?
そうすると、ArrayResizeは-1ではなく、-Countに設定する必要がありますね?
ええ、訂正します。
実験する機会がないので聞いてみました。
必要ありませんし、過負荷には役立ちません。
じゃあ、こんな感じ?
確かに、これは1次元によるインデックスを削除するのであって、要素を削除するのではないことを明確にする必要があります(多次元配列が 渡された場合、1次元のSインデックスによるすべての「要素」が削除されます)。必要ありませんし、過負荷には役立ちません。
なぜダメなのか?
この未試験のバージョンは動作するのでしょうか?
イリヤの変種を見たけど、空手形だから確認したくなかったんだ。
2つ目は、構造物の扱い方です。構造体の配列は、1次元の配列と同じように扱うことができます。
その結果
イリヤの変種を見たが、空手形なので確認しなかった。
int &arr[] シグネチャを持つ関数に 1次元以上の 配列を渡すことはできないので、その通りです。