Wie entferne ich ein Element aus einem Array (eindimensional und zweidimensional)? - Seite 8

 
Dmitry Fedoseev:

Es lässt sich kompilieren, aber es ist uninteressant, und was ist mit z[][][]?

Die zweite und die darüber liegenden Dimensionen können nicht dynamisch sein, aber die Funktion muss nicht für eine bestimmte Größe der zweiten Dimension angepasst werden, sie kann durch ArrayRange() herausgefunden werden.

Wenn die Anzahl der Messungen es nicht erlaubt, die Funktion zu überlasten, dann gilt dies auch für die Größe der zweiten und anderer Messungen. Außerdem ist es uninteressant, da es überhaupt nicht universell ist. Es wäre viel einfacher, Funktionen mit unterschiedlichen Namen zu schreiben.

Sie meinen, es sollte so geschrieben werden?

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

wenn es 4 Elemente in der zweiten Dimension gibt?

 
Alexey Viktorov:

Sie meinen, es sollte so geschrieben werden?

wenn es 4 Elemente in der zweiten Dimension gibt?

Schreiben Sie es so, wenn Sie wollen, es macht mir nichts aus.

 

So wird es auch sein:

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:

Schreiben Sie so, wenn Sie wollen, es macht mir nichts aus.

Ich frage, weil ich noch keine Gelegenheit hatte, zu experimentieren.

 
Dmitry Fedoseev:

Das ist es, wonach es aussieht:

Dann sollte ArrayResize auf -Count gesetzt werden, nicht auf -1, oder?

 
Ilya Malev:

Dann sollte ArrayResize auf -Count gesetzt werden, nicht auf -1, oder?

Ja. Korrigiert.

 
Alexey Viktorov:

Ich frage, weil ich noch keine Gelegenheit hatte, zu experimentieren.

Das ist nicht nötig und hilft auch nicht bei Überlastung.

 

Also etwa so?

#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);}
Stimmt, wir müssen klarstellen, dass es sich um das Entfernen des Indexes der ersten Dimension handelt, nicht um das Entfernen eines Elements (wenn ein mehrdimensionales Array übergeben wird, werden alle "Elemente" mit dem Index S der ersten Dimension entfernt).
 
Dmitry Fedoseev:

Das ist nicht nötig und hilft auch nicht bei Überlastung.

Warum nicht?

Wird diese ungetestete Version funktionieren?

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


Ich habe Iljas Variante gesehen und wollte sie nicht prüfen, weil sie ein leeres Unterfangen ist.

Die zweite Art, mit Strukturen zu arbeiten. Sie können mit einem Array von Strukturen wie mit einem eindimensionalen Array arbeiten.

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

Das Ergebnis ist

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:

Ich habe Iljas Variante gesehen und sie nicht geprüft, weil sie ein leeres Unterfangen ist.

Sie haben Recht, denn Sie können nicht mehr als ein 1-dimensionales Array an eine Funktion mit der Signaturint &arr[] übergeben.