Obrigado. A utilização da função ArraySwap não me teria ocorrido.
Compreendo que a sua função funcionará tanto ao aumentar como ao diminuir o tamanho, ou seja, como um análogo completo do ArrayResize.
Não será melhor simplesmente chamar a função padrão ArrayResize quando um array é aumentado, em vez de chamar as três funçõesArraySwap,ArrayResize,ArrayCopy?
p.s Testou a sua versão e a minha com duas cópias ao reduzir a matriz MqlTick de 1.000.000 para 500.0000. A sua versão fá-lo em 22 milésimos de segundo. O meu fá-lo em 37-38.
Não é melhor simplesmente chamar o ArrayResize padrão quando um array é aumentado do que chamar três funçõesArraySwap,ArrayResize,ArrayCopy
Pensei sobre isso, mas não o fiz, porque na realidade há mais subtilezas. Foi por isso que decidi manter a versão lacónica.
Uma das subtilezas é esta. Se tomar um conjunto de estruturas com construtores/destructores, o ArrayResize chamá-los-á em qualquer direcção numa quantidade igual à diferença de valores.
Mas a aplicação do ArrayCopy está a chamar todos os construtores. A remoção do ArrayTmp é uma chamada a todos os destruidores. Portanto, o ArrayResize2 não é realmente o ArrayResize.
Acontece que poderia simplesmente escrever ArrayResize( arr, new_size, -1) desta forma. Mas a sua versão é ainda mais rápida, cerca de 22 vs. 37 milissegundos.
SZY Na tabela que se abre no Terminal para o modo frame, não se pode executar nenhuma EA. Por isso, se quiser executá-lo em modo padrão, deve executá-lo num gráfico que não tenha sido aberto para molduras.
Não há qualquer alteração na documentação. Pode explicar isto com mais detalhe?
Um tal código
#property script_show_inputs#define externinput// macro redefinitionexternint i = 0;
voidOnStart() {}
irá sempre gerar um aviso. Estou a ser um pouco duro em relação ao "impossível". É possível anular, pelo que apenas um aviso será sempre pendurado em tais situações.
Uma das nuances é esta. Se tomar um conjunto de estruturas com construtores/destructores, então o ArrayResize em qualquer direcção chama-os num número igual à diferença de valores.
Mas a aplicação do ArrayCopy está a chamar todos os construtores. A remoção do ArrayTmp é uma chamada a todos os destruidores. Portanto, o ArrayResize2 não é realmente o ArrayResize.
Talvez se devesse chamar ArrayReallocate, embora eu não veja qualquer sentido em tal recopiar forçado. Provocaria um abrandamento desnecessário. A única coisa é provavelmente apenas se for necessário reiniciar os apontadores para um conjunto de objectos de classe (invalidar os seus valores anteriores), se for contabilizado em algum lugar (mas é antes uma muleta)
Alexey Navoykov: Então seria provavelmente mais correcto chamar-lhe ArrayReallocate, embora eu não veja qualquer sentido em tal recoperação forçada. Travagem desnecessária.
Obrigado. A utilização da função ArraySwap não me teria ocorrido.
Compreendo que a sua função funcionará tanto ao aumentar como ao diminuir o tamanho, ou seja, como um análogo completo do ArrayResize.
Não será melhor simplesmente chamar a função padrão ArrayResize quando um array é aumentado, em vez de chamar as três funçõesArraySwap,ArrayResize,ArrayCopy?
p.s Testou a sua versão e a minha com duas cópias ao reduzir a matriz MqlTick de 1.000.000 para 500.0000. A sua versão fá-lo em 22 milésimos de segundo. O meu fá-lo em 37-38.Não é melhor simplesmente chamar o ArrayResize padrão quando um array é aumentado do que chamar três funçõesArraySwap,ArrayResize,ArrayCopy
Pensei sobre isso, mas não o fiz, porque na realidade há mais subtilezas. Foi por isso que decidi manter a versão lacónica.
Uma das subtilezas é esta. Se tomar um conjunto de estruturas com construtores/destructores, o ArrayResize chamá-los-á em qualquer direcção numa quantidade igual à diferença de valores.
Mas a aplicação do ArrayCopy está a chamar todos os construtores. A remoção do ArrayTmp é uma chamada a todos os destruidores. Portanto, o ArrayResize2 não é realmente o ArrayResize.
Após a optimização, verá o seguinte
Se desligar o Expert Advisor em modo frame e o executar em modo standard, este mostrará os mesmos dados que obteve durante a optimização.
Esta abordagem permite-lhe voltar muitas vezes aos resultados da Optimização.
SZY Na tabela que se abre no Terminal para o modo frame, não se pode executar nenhuma EA. Por isso, se quiser executá-lo em modo padrão, deve executá-lo num gráfico que não tenha sido aberto para molduras.
fxsaber:
extern теперь является жестко заданным макросом
Assim, nem sempre será possível fazer o código MT5 mq4 funcionar sem alterações.
Não há alterações na documentação. Pode explicar isto com mais detalhe?
Não há qualquer alteração na documentação. Pode explicar isto com mais detalhe?
Um tal código
irá sempre gerar um aviso. Estou a ser um pouco duro em relação ao "impossível". É possível anular, pelo que apenas um aviso será sempre pendurado em tais situações.
Uma das nuances é esta. Se tomar um conjunto de estruturas com construtores/destructores, então o ArrayResize em qualquer direcção chama-os num número igual à diferença de valores.
Mas a aplicação do ArrayCopy está a chamar todos os construtores. A remoção do ArrayTmp é uma chamada a todos os destruidores. Portanto, o ArrayResize2 não é realmente o ArrayResize.
Então seria provavelmente mais correcto chamar-lhe ArrayReallocate, embora eu não veja qualquer sentido em tal recoperação forçada. Travagem desnecessária.
Libertar a memória é a única razão.