Como remover um elemento de uma matriz (bidimensional unidimensional)? - página 8

 
Dmitry Fedoseev:

Compila, mas não é interessante, e o que dizer de z[][][]?

A segunda e acima não pode ser dinâmica, mas a função não precisa ser personalizada para um determinado tamanho da segunda dimensão, ela pode ser descoberta através do ArrayRange().

Se o número de medidas não permitir sobrecarregar a função, o tamanho da segunda e outras medidas certamente não o farão. Além disso, não é nada interessante, já que não é nada universal. Seria muito mais fácil escrever funções com nomes diferentes.

Você quer dizer que deveria ser escrito assim?

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

se existem 4 elementos na segunda dimensão?

 
Alexey Viktorov:

Você quer dizer que deveria ser escrito assim?

se existem 4 elementos na segunda dimensão?

Se você quiser, escreva assim, não me importo.

 

É assim que vai ser:

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:

Escreva assim se quiser, eu não me importo.

Eu perguntei porque não tive a oportunidade de experimentar.

 
Dmitry Fedoseev:

É o que parece:

Então o ArrayResize deve ser ajustado para -Contar, não -1, não?

 
Ilya Malev:

Então o ArrayResize deve ser ajustado para -Contar, não -1, não?

Sim. Corrigido.

 
Alexey Viktorov:

Eu perguntei porque não tive a oportunidade de experimentar.

Você não precisa e isso não ajudará em caso de sobrecarga.

 

Então assim?

#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);}
É verdade, precisamos esclarecer que isto é remover o índice pela primeira dimensão, não remover um elemento (se uma matriz multidimensional for passada, então todos os "elementos" pelo índice S da primeira dimensão são removidos).
 
Dmitry Fedoseev:

Você não precisa e isso não ajudará em caso de sobrecarga.

Por que não?

Esta versão não testada vai funcionar?

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


Eu vi a variante de Ilya e não quis verificar, porque é um empreendimento vazio.

A segunda forma de trabalhar com estruturas. Você pode trabalhar com um conjunto de estruturas como com um conjunto unidimensional.

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

O resultado é

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:

Eu vi a variante de Ilya e não a verifiquei porque é um empreendimento vazio.

Você está certo, porque você não pode passar mais de uma matriz unidimensional para uma função com assinaturaint &arr[].