Dividere le posizioni aperte in gruppi - pagina 4

 
Alexey Viktorov:

Copiare l'array "in se stesso", iniziando dalla posizione accanto a quella da cancellare e scrivendo da quella da cancellare. E poi ridimensionare come suggerito da Grigori.S.B

È interessante, se ho capito bene, è necessario usare questa funzione?

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

Buongiorno, grazie per la sua risposta.

Immagino che non l'abbiate notato, potete guardare sopra, tutte le domande riguardavano MQL5.

Capisco che la differenza non è cruciale a volte, ma tuttavia. La funzione che hai citato ridimensiona l'array, forse tagliando elementi extra se la dimensione è ridotta.

Questo non è ciò che è necessario. È necessario rimuovere un elemento trovandolo per valore. Ho provato anch'io questa funzione, ne ho scritto nel #23. Grazie comunque.

Anche io non ci ho fatto caso. mql5 ha la funzione ArrayRemove e nessun problema.

 

In questo casoArrayRemove è più adatto, c'è un esempio nel manuale, funziona esattamente così

//| 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 
*/

L'unico problema è che questi esempi e funzioni sono progettati per array unidimensionali, e non vogliono lavorare con array bidimensionali.

Credo che mi manchi qualcosa di molto importante e fondamentale. Ma cos'è?

Ti dico che ho già perso il libro di riferimento.

 
Sergey Voytsekhovsky:

In questo casoArrayRemove è più adatto, c'è un esempio nel manuale, funziona esattamente così

L'unico problema è che questi esempi e funzioni sono progettati per array unidimensionali, e non vogliono lavorare con array bidimensionali.

Credo che mi manchi qualcosa di molto importante e fondamentale. Ma cos'è?

Ti dico che ho già perso il conto.

L'ordine è importante?
Copia dall'ultima posizione a quella da cancellare, ridimensiona l'array.
 
Alexey Viktorov:
Per un array bidimensionale, è necessario moltiplicare il numero di riga per la cancellazione per 2. Per una matrice tridimensionale moltiplicare per 3...

Non capisco bene questo, potresti elaborarlo, o meglio ancora, mostrarmi la modifica su un pezzo del mio codice, l'ho postato sopra. Se è scomodo, allora non importa, lo capirò in qualche modo.

 
Aliaksandr Hryshyn:
L'ordine è importante?
Si copia dall'ultima posizione a quella da cancellare, si ridimensiona l'array.

No, l'ordine non è importante, basta cancellare una voce nota (trovata per conoscenza, l'indice è noto). Può essere ovunque nell'array (all'inizio, in mezzo, alla fine).ArrayRemove è ottimo, tutto andrebbe bene, ma come applicare questa funzione a un array bidimensionale? il manuale non ne parla.

 
Sergey Voytsekhovsky:

No, l'ordine non è importante, abbiamo solo bisogno di cancellare un record noto (trovato dalla cognizione, l'indice è noto). Può essere ovunque nell'array (all'inizio, nel mezzo, alla fine).ArrayRemove è ottimo, tutto andrebbe bene, ma come applicare questa funzione a un array bidimensionale? Non c'è niente nel manuale su questo.

Quindi fate come ho detto, solo l'array nella seconda dimensione viene copiato.
Quando si ridimensiona un array, specificare anche un terzo parametro, ad esempio 32.
 
Sergey Voytsekhovsky:

In questo casoArrayRemove è più adatto, c'è un esempio nel manuale, funziona esattamente così

L'unico problema è che questi esempi e funzioni sono progettati per array unidimensionali, e non vogliono lavorare con array bidimensionali.

Credo che mi manchi qualcosa di molto importante e fondamentale. Ma cos'è?

Vi dico che ho perso il libro di riferimento.

Questa è una sciocchezza. Ho usato questa funzione senza leggere il manuale. Nel debugger ho visto come l'elemento è stato cancellato e la dimensione dell'array è stata immediatamente ridotta. Ho controllato, funziona anche con un array di strutture senza problemi. Ora non posso lavorare con il codice, ma solo con le parole: per esempio, voglio cancellare il 3° indice da un array bidimensionale. Si scopre che il quinto e il sesto valore devono essere rimossi. Al momento della copia, la funzione organizza tutti i valori in un array unidimensionale e si scopre che la terza coppia inizia con l'indice 5. In generale questo si realizza dopo alcuni esperimenti.

Per quanto riguarda ArrayRemove, quando posso, lo testerò su array di 2-4 dimensioni. Per mancanza di necessità non l'ho mai testato e non ho sospettato che non funzionasse.


Aggiunto:

Controllato. Non dimenticate che non potete ridimensionare un array statico. Ecco perché nell'esempio della documentazione la dimensione dell'array rimane la stessa e le ultime due stringhe sono ripetute. Quando si cancellano righe da un array dinamico, la dimensione cambia senza problemi.

Il manuale deve essere sfregato fino ai fori: )))) nel 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

Ecco l'array tridimensionale e il risultato:

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:

Questa è una sciocchezza. Ho usato questa funzione senza leggere il manuale. Nel debugger ho visto come l'elemento viene cancellato e la dimensione dell'array si riduce istantaneamente. Controllato, anche su un array di strutture funziona senza problemi. Ora non posso lavorare con il codice, ma solo con le parole: per esempio, voglio cancellare il 3° indice da un array bidimensionale. Si scopre che il quinto e il sesto valore devono essere rimossi. Al momento della copia, la funzione organizza tutti i valori in un array unidimensionale e si scopre che la terza coppia inizia con l'indice 5. In generale questo si realizza dopo alcuni esperimenti.

Per quanto riguarda ArrayRemove, quando posso, lo testerò su array di 2-4 dimensioni. Per mancanza di necessità non l'ho mai testato e non ho sospettato che non funzionasse.


Aggiunto:

Controllato. Non dimenticate che non potete ridimensionare un array statico. Ecco perché nell'esempio della documentazione la dimensione dell'array rimane la stessa e le ultime due stringhe sono ripetute. Quando si cancellano righe da un array dinamico, la dimensione cambia senza problemi.

La directory deve essere cancellata in holes:)))) nel monitor.

Qui ho fatto un array tridimensionale e il risultato:

Il tuo esempio è molto lento, con un gran numero di valori questo sarà evidente.
 
Aliaksandr Hryshyn:
Il tuo esempio è molto lento, con un gran numero di valori questo sarà evidente.

Con un sacco di cosa? Elementi dell'array che non sono nemmeno riempiti ad ogni tick? Come si noterà?