Grazie. Usare la funzione ArraySwap non mi sarebbe venuto in mente.
Ho capito che la tua funzione funzionerà sia quando si aumenta che quando si diminuisce la dimensione, cioè come un analogo completo di ArrayResize.
Non è meglio chiamare semplicemente la funzione standard ArrayResize quando un array viene ingrandito, piuttosto che chiamare le tre funzioniArraySwap,ArrayResize,ArrayCopy?
p.s Testato la tua versione e la mia con due copie quando si riduce l'array MqlTick da 1.000.000 a 500.0000. La tua versione lo fa in 22 milsecondi. Il mio lo fa in 37-38.
Non è meglio chiamare semplicemente lo standard ArrayResize quando un array viene espanso, piuttosto che chiamare le tre funzioniArraySwap,ArrayResize,ArrayCopy
Ci ho pensato, ma non l'ho fatto, perché in realtà ci sono più sottigliezze. Ecco perché ho deciso di attenermi alla versione laconica.
Una delle sottigliezze è questa. Se prendete un array di strutture con costruttori/distruttori, ArrayResize li richiamerà in entrambe le direzioni in una quantità pari alla differenza di valori.
Ma applicare ArrayCopy significa chiamare tutti i costruttori. La rimozione di ArrayTmp è una chiamata a tutti i distruttori. Quindi ArrayResize2 non è veramente ArrayResize.
Si scopre che si potrebbe semplicemente scrivere ArrayResize( arr, new_size, -1) in questo modo. Ma la tua versione è ancora più veloce, circa 22 contro 37 millisecondi.
SZY Sul grafico aperto nel Terminale per la modalità frame, non è possibile eseguire alcun EA. Quindi, se volete eseguirlo in modalità standard, dovreste eseguirlo su un grafico che non è stato aperto per i frame.
Non c'è nessun cambiamento nella documentazione. Puoi spiegare questo in modo più dettagliato?
Tale codice
#property script_show_inputs#define externinput// macro redefinitionexternint i = 0;
voidOnStart() {}
genererà sempre un avvertimento. Sono un po' duro su "impossibile". È possibile sovrascrivere, quindi solo un avvertimento sarà sempre appeso in tali situazioni.
Una delle sfumature è questa. Se prendete un array di strutture con costruttori/distruttori, allora ArrayResize in entrambe le direzioni li chiama in un numero pari alla differenza di valori.
Ma applicare ArrayCopy significa chiamare tutti i costruttori. La rimozione di ArrayTmp è una chiamata a tutti i distruttori. Quindi ArrayResize2 non è veramente ArrayResize.
Forse dovrebbe essere chiamato ArrayReallocate, anche se non vedo alcun senso in una tale ricopiatura forzata. Causerebbe un rallentamento non necessario. L'unica cosa è probabilmente solo se è richiesto di resettare i puntatori per un array di oggetti di classe (invalidare i loro valori precedenti), se è contabilizzato da qualche parte (ma è piuttosto una stampella)
Alexey Navoykov: Allora sarebbe probabilmente più corretto chiamarlo ArrayReallocate, anche se non vedo alcun senso in questa ricopiatura forzata. Frenata inutile.
Consenti l'uso dei cookie per accedere al sito MQL5.com.
Abilita le impostazioni necessarie nel browser, altrimenti non sarà possibile accedere.
Hai effettuato l'accesso. L'autenticazione a due fattori è stata disattivata. Configurala di nuovo e scansiona un nuovo codice QR, oppure continua con l'autenticazione a due fattori disattivata.
Grazie. Usare la funzione ArraySwap non mi sarebbe venuto in mente.
Ho capito che la tua funzione funzionerà sia quando si aumenta che quando si diminuisce la dimensione, cioè come un analogo completo di ArrayResize.
Non è meglio chiamare semplicemente la funzione standard ArrayResize quando un array viene ingrandito, piuttosto che chiamare le tre funzioniArraySwap,ArrayResize,ArrayCopy?
p.s Testato la tua versione e la mia con due copie quando si riduce l'array MqlTick da 1.000.000 a 500.0000. La tua versione lo fa in 22 milsecondi. Il mio lo fa in 37-38.Non è meglio chiamare semplicemente lo standard ArrayResize quando un array viene espanso, piuttosto che chiamare le tre funzioniArraySwap,ArrayResize,ArrayCopy
Ci ho pensato, ma non l'ho fatto, perché in realtà ci sono più sottigliezze. Ecco perché ho deciso di attenermi alla versione laconica.
Una delle sottigliezze è questa. Se prendete un array di strutture con costruttori/distruttori, ArrayResize li richiamerà in entrambe le direzioni in una quantità pari alla differenza di valori.
Ma applicare ArrayCopy significa chiamare tutti i costruttori. La rimozione di ArrayTmp è una chiamata a tutti i distruttori. Quindi ArrayResize2 non è veramente ArrayResize.
Dopo l'ottimizzazione, vedrete quanto segue
Se spegni l'Expert Advisor in modalità frame e lo esegui in modalità standard, mostrerà gli stessi dati che ha ottenuto durante l'ottimizzazione.
Questo approccio permette di tornare più volte ai risultati dell'ottimizzazione.
SZY Sul grafico aperto nel Terminale per la modalità frame, non è possibile eseguire alcun EA. Quindi, se volete eseguirlo in modalità standard, dovreste eseguirlo su un grafico che non è stato aperto per i frame.
fxsaber:
extern теперь является жестко заданным макросом
Di conseguenza, non sarà sempre possibile far funzionare il codice MT5 mq4 senza modifiche.
Non ci sono cambiamenti nella documentazione. Puoi spiegare questo in modo più dettagliato?
Non c'è nessun cambiamento nella documentazione. Puoi spiegare questo in modo più dettagliato?
Tale codice
genererà sempre un avvertimento. Sono un po' duro su "impossibile". È possibile sovrascrivere, quindi solo un avvertimento sarà sempre appeso in tali situazioni.
Una delle sfumature è questa. Se prendete un array di strutture con costruttori/distruttori, allora ArrayResize in entrambe le direzioni li chiama in un numero pari alla differenza di valori.
Ma applicare ArrayCopy significa chiamare tutti i costruttori. La rimozione di ArrayTmp è una chiamata a tutti i distruttori. Quindi ArrayResize2 non è veramente ArrayResize.
Allora sarebbe probabilmente più corretto chiamarlo ArrayReallocate, anche se non vedo alcun senso in questa ricopiatura forzata. Frenata inutile.
Liberare la memoria è l'unica ragione.