Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 1005

 
Ecco come funziona.
 
Seric29:
Ecco come funziona.
Ilyas lo ha già spiegato abbastanza chiaramente. Cercatelo nei suoi post.
 
Seric29:
Ecco come funziona.

Sei sicuro di aver letto tutto nella documentazione? Avete anche letto questo:

Nota

La funzione può essere applicata solo agli array dinamici. Dovreste tenere a mente che gli array dinamici assegnati come buffer di indicatori dalla funzione SetIndexBuffer() non possono essere ridimensionati. Tutte le operazioni relative al ridimensionamento dei buffer degli indicatori sono eseguite dal sottosistema esecutivo del terminale.

Il numero totale di elementi in una matrice non può superare 2147483647.

Se la memoria viene allocata frequentemente, si raccomanda di utilizzare il terzo parametro che specifica la riserva per ridurre la quantità di allocazione della memoria fisica. Tutte le chiamate successive alla funzione ArrayResize non risulteranno in una riallocazione della memoria fisica, solo un ridimensionamento della prima dimensione dell'array all'interno della memoria riservata. Tenete a mente che il terzo parametro sarà usato solo quando l'allocazione della memoria fisica è in corso, per esempio:

ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
ArrayResize(arr,i,1000);

In questo caso ci saranno 2 allocazioni di memoria, una volta prima di entrare nel ciclo per 3000 iterazioni, con la dimensione dell'array impostata a 1000 e la seconda a i uguale a 2000. Se il terzo parametro viene omesso, ci saranno 2.000 riallocazioni di memoria fisica e questo rallenterà l'esecuzione del programma.


Cosa non è chiaro?

 
Alexey Viktorov:

Sei sicuro di aver letto tutto nella documentazione? Leggi anche questo:

Cosa non è chiaro in questo?

Beh, questo è il punto che non ci sono immagini o esempi, e si può indovinare cosa significano queste ridistribuzioni, e come usarle al 100% secondo l'idea degli sviluppatori se non è spiegato. A giudicare da queste 3 righe che sono scritte qui, penso che ArrayResize(arr,1000,1000); crea un array di 2 mila elementi. Ma qui non è chiaro. Se faccio ArrayResize(arr,1,1000); per esempio, 1000 si blocca finché l'array non arriva a 1000.

for(int i=1;i<1001;i++)ArrayResize(массив,i,1000);

Oppure il programma userà questo frammento prima dell'overclock, incrementando solo il contatore. Oppure questo 1000 è solo in giro per ottenere rapidamente la memoria dalla CPU, se è così allora anche la memoria di backup dovrà essere trasferita, allora è più facile lavorare senza backup. In generale, nessun codice, nessuna informazione, nessuna immagine, nessuna idea di come funziona.

 
Avete mai avuto questa situazione in cui l'hard disk è caricato al 100% da una classe di sistema di qualche tipo (su 10ka)? Succede anche con il terminale alps... Di solito i terminali caricano il disco durante i test, ma qui è solo kabbda... Non lungo, 3-5 secondi, ma concreto
 
Yevhenii Levchenko:
Vi è mai capitato che il vostro disco rigido si avvii al 100% con una classe di sistema di qualche tipo (su 10)? Succede anche con il terminale alps... Di solito i terminali caricano il disco durante i test, ma qui è solo kabbda... Non lungo, 3-5 secondi, ma concreto

succede, ma dopo il riavvio del PC

a 10-15 minuti dopo il riavvio del PC, Windows Defender "mastica il disco" e le statistiche di utilizzo del PC vengono raccolte

soluzione - sospendere il PC, il mio PC può andare un mese senza riavviarsi, premo il pulsante di sospensione sulla tastiera invece di spegnere il PC - un paio di volte la corrente è andata via, nessun problema con l'avvio di Win10 se il PC era in sospensione

 
Seric29:

Questo è il punto, non ci sono immagini o esempi, e si può indovinare cosa significano queste ridistribuzioni, e come usarle al 100% secondo l'idea degli sviluppatori se non è spiegato. A giudicare da queste 3 righe che sono scritte qui, penso che ArrayResize(arr,1000,1000); crea un array di 2 mila elementi. Ma qui non è chiaro. Se faccio ArrayResize(arr,1,1000); per esempio, 1000 si blocca finché l'array non arriva a 1000.

Oppure il programma userà questo frammento prima dell'overclock, incrementando solo il contatore. In generale, dico che non è chiaro e questo è tutto. O questo 1000 è solo stupido in giro per rapidamente scoop memoria dal processore, se è così allora tutto lo stesso e la memoria di backup, anche, dovrà trasferire allora è più facile lavorare senza la riserva. In generale, nessun codice, nessuna informazione, nessuna immagine, nessuna idea di come funziona.

Dovreste leggere non solo le tre linee di codice, ma anche il testo che spiega tutto abbastanza chiaramente.

La memoria riservata e la dimensione dell'array sono nozioni diverse. Se sovrascrivete la dimensione dell'array con ArrayResize(arr,1000,1000); l'ultimo elemento dell'array sarà 999 e non più. Ma se avete bisogno di aumentare le dimensioni dell'array, non ci sarà alcuna riallocazione di memoria. Se non avete bisogno di una tale riserva di dimensioni dell'array, fatela più piccola o non riservatela affatto.

 

Buon pomeriggio!
Voglio mettere un parametro come array in una funzione. Non riesco a capire come farlo bene. Puoi correggere l'esempio?

void OnTick()
  {
//---
   int TestArr[]= {5,3,9,4};
   TestFArr(TestArr[]);
  }
//+------------------------------------------------------------------+

void TestFArr(int TestArr[])
  {
   int size=ArraySize(TestArr);
   Print(" --------------- size: ",size);
  }
//+------------------------------------------------------------------+
 
Nauris Zukas:

Buon pomeriggio!
Voglio mettere un parametro come array in una funzione. Non riesco a capire come farlo bene. Puoi correggere l'esempio?

void OnTick()
  {
//---
   int TestArr[]= {5,3,9,4};
   TestFArr(TestArr);
  }
//+------------------------------------------------------------------+

void TestFArr(int & TestArr[])
  {
   int size=ArraySize(TestArr);
   Print(" --------------- size: ",size);
  }
//+------------------------------------------------------------------+
 
Artyom Trishkin:

Grazie!

Motivazione: