Dividir as posições em aberto em grupos - página 4

 
Alexey Viktorov:

Copiar a matriz "em si mesma", começando na posição ao lado da que deve ser apagada e escrevendo a partir da que deve ser apagada. E depois redimensionar como sugerido por Grigori.S.B

Curiosamente, se eu o entendi corretamente, você precisa usar esta função?

int  ArrayCopy( 
   void&        dst_array[],         // куда копируем 
   const void&  src_array[],         // откуда копируем 
   int          dst_start=0,         // с какого индекса пишем в приемник 
   int          src_start=0,         // с какого индекса копируем из источника 
   int          count=WHOLE_ARRAY    // сколько элементов 
   );
 
Sergey Voytsekhovsky:

Bom dia, obrigado por sua resposta.

Acho que você não notou, você pode olhar acima, todas as perguntas eram sobre a MQL5.

Entendo que a diferença não é crucial às vezes, mas mesmo assim. A função que você citou redimensiona a matriz, talvez cortando elementos extras se o tamanho for reduzido.

Isto não é o que é necessário. É preciso remover um elemento, encontrando-o por valor. Eu também tentei esta função, escrevi sobre ela em #23. De qualquer forma, obrigado.

Também não prestei atenção a isso. O mql5 tem a função ArrayRemove e sem problemas.

 

Neste caso oArrayRemove é mais adequado, há um exemplo no manual, ele funciona exatamente como este

//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- объявим массив фиксированного размера и заполним значениями 
   int array[10]; 
   for(int i=0;i<10;i++) 
     { 
      array[i]=i; 
     } 
//--- покажем массив до удаления элементов 
   Print("До вызова ArrayRemove()"); 
   ArrayPrint(array); 
//--- удалим 2 элемента из массива и покажем новый состав 
   ArrayRemove(array,4,2); 
   Print("После вызова ArrayRemove()"); 
   ArrayPrint(array); 
/* 
   Результат выполнения:  
   До вызова ArrayRemove() 
   0 1 2 3 4 5 6 7 8 9 
   После вызова ArrayRemove() 
   0 1 2 3 6 7 8 9 8 9 
*/

O único problema é que estes exemplos e funções são projetados para matrizes unidimensionais, e eles não querem trabalhar com matrizes bidimensionais.

Acho que estou sentindo falta de algo muito importante e fundamental. Mas o que é isso?

Estou lhes dizendo, já perdi o livro de referência.

 
Sergey Voytsekhovsky:

Neste caso oArrayRemove é mais adequado, há um exemplo no manual, ele funciona exatamente como este

O único problema é que estes exemplos e funções são projetados para matrizes unidimensionais, e eles não querem trabalhar com matrizes bidimensionais.

Acho que estou sentindo falta de algo muito importante e fundamental. Mas o que é isso?

Estou lhe dizendo, eu já perdi o rastro disso.

A ordem é importante?
Da última posição que você copia para a que deve ser apagada, redimensione a matriz.
 
Alexey Viktorov:
Para uma matriz bidimensional, você precisa multiplicar o número da linha para eliminação por 2. Para uma matriz tridimensional multiplicar por 3...

Não entendo bem isto, você poderia, por favor, elaborar ou melhor ainda, me mostrar a edição de um trecho do meu código, eu o coloquei acima. Se for inconveniente, então o que quer que seja, eu vou descobrir de alguma forma.

 
Aliaksandr Hryshyn:
A ordem é importante?
Você copia da última posição para a posição a ser apagada, redimensiona a matriz.

Não, a ordem não é importante, basta apagar uma entrada conhecida (encontrada pelo conhecimento, o índice é conhecido). Pode estar em qualquer lugar da matriz (no início, no meio, no final).ArrayRemove é ótimo, tudo estaria bem, mas como aplicar esta função a uma matriz bidimensional? o manual é silencioso sobre isso.

 
Sergey Voytsekhovsky:

Não, a ordem não é importante, apenas precisamos apagar um registro conhecido (encontrado por cognição, índice é conhecido). Pode estar em qualquer lugar da matriz (no início, no meio, no final).ArrayRemove é ótimo, tudo estaria bem, mas como aplicar esta função a uma matriz bidimensional? Não há nada no manual sobre isso.

Faça o mesmo que eu disse, apenas a matriz na segunda dimensão é copiada.
Ao redimensionar uma matriz, especifique também um terceiro parâmetro, por exemplo, 32.
 
Sergey Voytsekhovsky:

Neste caso oArrayRemove é mais adequado, há um exemplo no manual, ele funciona exatamente da mesma maneira

O único problema é que estes exemplos e funções são projetados para matrizes unidimensionais, e eles não querem trabalhar com matrizes bidimensionais.

Acho que estou sentindo falta de algo muito importante e fundamental. Mas o que é isso?

Estou lhe dizendo, eu perdi o livro de referência.

Isso é um absurdo. Eu usei esta função sem ler o manual. No depurador eu vi como o elemento foi excluído e o tamanho da matriz foi instantaneamente reduzido. Eu verifiquei, funciona mesmo com uma série de estruturas sem nenhum problema. Agora não posso trabalhar com o código, mas apenas com palavras: por exemplo, quero apagar o 3º índice de uma matriz bidimensional. Acontece que o quinto e o sexto valores têm que ser removidos. Ao copiar, a função, HOWEVER, organiza todos os valores em uma matriz unidimensional e acontece que o terceiro par começa com o índice 5. Isto geralmente chega a uma realização após algumas experiências.

Quanto ao ArrayRemove quando eu puder, vou testá-lo em matrizes de 2-4 dimensões. Por falta de necessidade, nunca o testei e não suspeitei que não funcionasse.


Adicionado:

Verificado. Não esqueça que você não pode redimensionar uma matriz estática. É por isso que no exemplo da documentação o tamanho da matriz permanece o mesmo e as duas últimas cordas são repetidas. Quando você elimina linhas de uma matriz dinâmica, o tamanho muda sem nenhum problema.

O manual deve ser esfregado nos buracos: )))) no monitor.

/********************Script program start function*******************/
void OnStart()
 {
  double arrTest[][ 2];
  for(int i = 0; i < 10; i++)
   {
    ArrayResize(arrTest, i+1);
    arrTest[i][0] = iOpen(_Symbol, PERIOD_CURRENT, i);
    arrTest[i][1] = iClose(_Symbol, PERIOD_CURRENT, i);
   }
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
    ArrayRemove(arrTest, 3, 2);
    Print("ArraySize ", ArraySize(arrTest));
    ArrayPrint(arrTest);
         );
 }/******************************************************************/
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 20
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16525 1.16876
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16467 1.16525
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [8,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [9,] 1.15447 1.16156
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  ArraySize 16
2020.03.23 11:36:02.296 00 (GBPUSD,H1)          [,0]    [,1]
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [0,] 1.16465 1.16084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [1,] 1.17094 1.16461
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [2,] 1.16878 1.17084
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [3,] 1.16491 1.16467
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [4,] 1.16186 1.16498
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [5,] 1.15985 1.16185
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [6,] 1.16156 1.15985
2020.03.23 11:36:02.296 00 (GBPUSD,H1)  [7,] 1.15447 1.16156

Aqui está a matriz tridimensional e o resultado:

2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 30
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 3.00000 1.16525 1.16876
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 4.00000 1.16467 1.16525
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [8,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [9,] 9.00000 1.15447 1.16156
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  ArraySize 24
2020.03.23 11:40:11.328 00 (GBPUSD,H1)          [,0]    [,1]    [,2]
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [0,] 0.00000 1.16465 1.16255
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [1,] 1.00000 1.17094 1.16461
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [2,] 2.00000 1.16878 1.17084
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [3,] 5.00000 1.16491 1.16467
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [4,] 6.00000 1.16186 1.16498
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [5,] 7.00000 1.15985 1.16185
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [6,] 8.00000 1.16156 1.15985
2020.03.23 11:40:11.328 00 (GBPUSD,H1)  [7,] 9.00000 1.15447 1.16156
 
Alexey Viktorov:

Isso é uma bobagem. Eu usei esta função sem ler o manual. No depurador eu vi como o elemento é excluído e o tamanho da matriz é instantaneamente reduzido. Verificado, mesmo em um conjunto de estruturas funciona sem problemas. Agora não posso trabalhar com o código, mas apenas com palavras: por exemplo, quero apagar o 3º índice de uma matriz bidimensional. Acontece que o quinto e o sexto valores têm que ser removidos. Ao copiar, a função, HOWEVER, organiza todos os valores em uma matriz unidimensional e acontece que o terceiro par começa com o índice 5. Isto geralmente chega a uma realização após algumas experiências.

Quanto ao ArrayRemove quando eu puder, vou testá-lo em matrizes de 2-4 dimensões. Por falta de necessidade, nunca o testei e não suspeitei que não funcionasse.


Adicionado:

Verificado. Não esqueça que você não pode redimensionar uma matriz estática. É por isso que no exemplo da documentação o tamanho da matriz permanece o mesmo e as duas últimas cordas são repetidas. Quando você elimina linhas de uma matriz dinâmica, o tamanho muda sem nenhum problema.

O diretório tem que ser lavado até os buracos: )))) no monitor.

Aqui eu fiz uma matriz tridimensional e o resultado:

Seu exemplo é muito lento, com um grande número de valores que isto será perceptível.
 
Aliaksandr Hryshyn:
Seu exemplo é muito lento, com um grande número de valores que isto será perceptível.

Com muito o quê? Elementos de matriz que não são preenchidos em cada carrapato? Como será perceptível?

Razão: