如何从一个数组(一维二维)中删除一个元素? - 页 8 123456789 新评论 Alexey Viktorov 2018.12.24 09:26 #71 Dmitry Fedoseev:它可以编译,但它并不有趣,那么z[][][]呢? 第二维及以上的尺寸不能是动态的,但该函数不需要为第二维的特定尺寸进行定制,它可以通过ArrayRange()查出。 如果测量值的数量不允许超载,那么第二个和其他测量值的大小当然也不允许超载。而且这一点都不有趣,因为它根本不具有普遍性。如果用不同的名字来写函数就会容易得多。你是说应该这样写吗? void z(int size_second_dimension,int & z[][4],int shift){}; 如果在第二维度有4个元素? Dmitry Fedoseev 2018.12.24 09:49 #72 Alexey Viktorov:你是说应该这样写吗? 如果在第二维度有4个元素?如果你想这样写,我不介意。 Dmitry Fedoseev 2018.12.24 10: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 10:39 #74 Dmitry Fedoseev:如果你想这样写,我不介意。我问是因为我还没有机会做实验。 Ilya Malev 2018.12.24 10:55 #75 Dmitry Fedoseev:这就是它的模样。那么ArrayResize 应该被设置为-Count,而不是-1,不是吗? Dmitry Fedoseev 2018.12.24 10:58 #76 Ilya Malev:那么ArrayResize应该被设置为-Count,而不是-1,不是吗?是的,已经改正。 Dmitry Fedoseev 2018.12.24 10:59 #77 Alexey Viktorov:我问是因为我还没有机会做实验。你不需要这样做,而且对于超载也没有帮助。 Ilya Malev 2018.12.24 11: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);} 诚然,我们需要澄清的是,这是删除第一维的索引,而不是删除一个元素(如果传递的是一个多维数组,那么第一维的S索引的所有 "元素 "都被删除)。 Alexey Viktorov 2018.12.24 12: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); }; 我看到伊利亚的变体,不想去检查,因为这是一个空洞的承诺。 第二种方法是用结构来工作。你可以像处理一维数组一样处理一个结构数组。 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 12:10 #80 Alexey Viktorov:我看到了伊利亚的变体,但没有检查,因为它是一个空洞的承诺。 你是对的,因为你不能向带有int &arr[] 签名的函数传递 多于一维的数组。 123456789 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
它可以编译,但它并不有趣,那么z[][][]呢?
第二维及以上的尺寸不能是动态的,但该函数不需要为第二维的特定尺寸进行定制,它可以通过ArrayRange()查出。
如果测量值的数量不允许超载,那么第二个和其他测量值的大小当然也不允许超载。而且这一点都不有趣,因为它根本不具有普遍性。如果用不同的名字来写函数就会容易得多。
你是说应该这样写吗?
如果在第二维度有4个元素?
你是说应该这样写吗?
如果在第二维度有4个元素?
如果你想这样写,我不介意。
事情就是这样的。
如果你想这样写,我不介意。
我问是因为我还没有机会做实验。
这就是它的模样。
那么ArrayResize 应该被设置为-Count,而不是-1,不是吗?
那么ArrayResize应该被设置为-Count,而不是-1,不是吗?
是的,已经改正。
我问是因为我还没有机会做实验。
你不需要这样做,而且对于超载也没有帮助。
然后像这样?
诚然,我们需要澄清的是,这是删除第一维的索引,而不是删除一个元素(如果传递的是一个多维数组,那么第一维的S索引的所有 "元素 "都被删除)。你不需要这样做,而且对于超载也没有帮助。
为什么不呢?
这个未经测试的版本能不能用?
我看到伊利亚的变体,不想去检查,因为这是一个空洞的承诺。
第二种方法是用结构来工作。你可以像处理一维数组一样处理一个结构数组。
其结果是
我看到了伊利亚的变体,但没有检查,因为它是一个空洞的承诺。
你是对的,因为你不能向带有int &arr[] 签名的函数传递 多于一维的数组。