Comment supprimer un élément d'un tableau (unidimensionnel bidimensionnel) ? - page 8

 
Dmitry Fedoseev:

Cela compile, mais ce n'est pas intéressant, et qu'en est-il de z[][][] ?

La deuxième dimension et les dimensions supérieures ne peuvent pas être dynamiques, mais la fonction n'a pas besoin d'être personnalisée pour une taille particulière de la deuxième dimension, elle peut être trouvée par ArrayRange().

Si le nombre de mesures ne permet pas de surcharger la fonction, la taille de la seconde et des autres mesures ne le permettra certainement pas. D'ailleurs, ce n'est pas du tout intéressant, puisque ce n'est pas du tout universel. Il serait beaucoup plus facile d'écrire des fonctions avec des noms différents.

Vous voulez dire que ça devrait être écrit comme ça ?

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

s'il y a 4 éléments dans la deuxième dimension ?

 
Alexey Viktorov:

Vous voulez dire que ça devrait être écrit comme ça ?

s'il y a 4 éléments dans la deuxième dimension ?

Ecris-le comme ça si tu veux, ça ne me dérange pas.

 

C'est comme ça que ça va se passer :

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:

Ecris comme ça si tu veux, ça ne me dérange pas.

Je demande parce que je n'ai pas eu l'occasion d'expérimenter.

 
Dmitry Fedoseev:

C'est à ça que ça ressemble :

Alors ArrayResize devrait être réglé sur -Count, et non -1, non ?

 
Ilya Malev:

Alors ArrayResize devrait être réglé sur -Count, et non -1, non ?

Ouais. Corrigé.

 
Alexey Viktorov:

Je demande parce que je n'ai pas eu l'occasion d'expérimenter.

Vous n'en avez pas besoin et cela n'aidera pas en cas de surcharge.

 

Alors comme ça ?

#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);}
Il est vrai que nous devons préciser qu'il s'agit de supprimer l'indice de la première dimension, et non de supprimer un élément (si un tableau multidimensionnel est transmis, alors tous les "éléments" de l'indice S de la première dimension sont supprimés).
 
Dmitry Fedoseev:

Vous n'en avez pas besoin et cela ne vous aidera pas en cas de surcharge.

Pourquoi pas ?

Cette version non testée fonctionnera-t-elle ?

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


J'ai vu la variante d'Ilya et je n'ai pas voulu la vérifier, car c'est une entreprise vide.

La deuxième façon de travailler avec les structures. Vous pouvez travailler avec un tableau de structures comme avec un tableau unidimensionnel.

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

Le résultat est

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:

J'ai vu la variante d'Ilya et je ne l'ai pas vérifiée parce que c'est un engagement vide.

Vous avez raison, car vous ne pouvez pas passer plus d'un tableau à une dimension à une fonction avec la signatureint &arr[].