Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1005

 
É assim que funciona.
 
Seric29:
É assim que funciona.
Ilyas já o explicou muito claramente. Procure-o em seus postos.
 
Seric29:
É assim que funciona.

Você tem certeza de ter lido tudo o que está na documentação? Você até leu isto:

Nota

A função só pode ser aplicada a arrays dinâmicos. Você deve ter em mente que as matrizes dinâmicas atribuídas como amortecedores indicadores pela função SetIndexBuffer() não podem ser redimensionadas. Todas as operações relacionadas ao redimensionamento de buffers indicadores são realizadas pelo subsistema executivo do terminal.

O número total de elementos de uma matriz não pode exceder 2147483647.

Se a memória for alocada com freqüência, recomenda-se usar o terceiro parâmetro especificando a reserva para reduzir a quantidade de alocação de memória física. Todas as chamadas subsequentes à função ArrayResize não resultarão em realocação da memória física, apenas um redimensionamento da primeira dimensão da matriz dentro da memória reservada. Tenha em mente que o terceiro parâmetro só será usado quando a alocação de memória física estiver em andamento, por exemplo:

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

Neste caso, haverá 2 alocações de memória, uma antes de entrar na malha para 3000 iterações, com a dimensão da matriz definida para 1000 e a segunda para i igual a 2000. Se o terceiro parâmetro for omitido, haverá 2.000 realocações de memória física e isto atrasará a execução do programa.


O que não está claro sobre isso?

 
Alexey Viktorov:

Você tem certeza de ter lido tudo o que está na documentação? Até mesmo leia isto:

O que não está claro sobre isto??

Bem, esse é o ponto que não há fotos ou exemplos, e você pode adivinhar o significado dessas redistribuições, e como utilizá-la 100% de acordo com a idéia dos desenvolvedores, se não for explicada. Julgando por estas 3 linhas que estão escritas aqui, penso que o ArrayResize(arr.1000.1000); cria um conjunto de 2 mil elementos. Mas não está claro aqui. Se eu fizer ArrayResize(arr,1.1000); por exemplo, 1000 ficará ocioso até que o array chegue a 1000.

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

Ou o programa usará este fragmento antes do overclocking, apenas incrementando o contador. Ou este 1000 está apenas deitado para obter rapidamente memória da CPU, se for assim, então a memória de backup também terá que ser transferida, então é mais fácil de trabalhar sem backup. Em geral, sem código, sem informação, sem imagens, sem idéia de como funciona.

 
Você já teve esta situação em que o disco rígido é 100% carregado por algum tipo de Sistema (em 10ka)? Também acontece com o terminal alpino... Normalmente os terminais carregam o disco durante os testes, mas aqui é só kabbda... Não longo, 3-5 segundos, mas concreto
 
Yevhenii Levchenko:
Alguma vez aconteceu de seu disco rígido ser 100% de algum tipo de sistema de inicialização (no 10)? Também acontece com o terminal alpino... Normalmente os terminais carregam o disco durante os testes, mas aqui é só kabbda... Não longo, 3-5 segundos, mas concreto

acontece, mas após a reinicialização do PC

aos 10-15 minutos após o reinício do PC Windows Defender "mastiga o disco" e as estatísticas de uso do PC são coletadas

solução - suspender o PC, meu PC pode ficar um mês sem reiniciar, eu aperto o botão de dormir no teclado ao invés de desligar o PC - algumas vezes a energia se apagou, não há problema com a inicialização do Win10 se o PC estivesse em repouso

 
Seric29:

É isso mesmo, não há fotos ou exemplos, e você pode adivinhar o que essas redistribuições significam, e como utilizá-la 100% de acordo com a idéia dos desenvolvedores, se não for explicada. Julgando por estas 3 linhas que estão escritas aqui, penso que o ArrayResize(arr.1000.1000); cria um conjunto de 2 mil elementos. Mas não está claro aqui. Se eu fizer ArrayResize(arr,1.1000); por exemplo, 1000 ficará ocioso até que o array chegue a 1000.

Ou o programa usará este fragmento antes do overclocking, apenas incrementando o contador. Ou este 1000 está apenas deitado para obter rapidamente memória da CPU, se for assim, então a memória de backup também terá que ser transferida, então é mais fácil de trabalhar sem backup. Em geral, sem código, sem informação, sem imagens, sem idéia de como funciona.

Você deve ler não apenas as três linhas de código, mas também o texto que explica tudo muito claramente.

A memória reservada e o tamanho da matriz são noções diferentes. Se você anular o tamanho da matriz com ArrayResize(arr,1000,1000); o último elemento da matriz será 999 e não mais. Mas se você precisar aumentar o tamanho da matriz, não haverá reatribuição de memória. Se você não precisa de tal reserva de tamanho de matriz, faça-a menor ou não a reserve de forma alguma.

 

Boa tarde!
Eu quero colocar um parâmetro como uma matriz em uma função. Não consigo descobrir como fazê-lo corretamente. Você pode corrigir o exemplo?

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

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

Boa tarde!
Eu quero colocar um parâmetro como uma matriz em uma função. Não consigo descobrir como fazê-lo corretamente. Você pode corrigir o exemplo?

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

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

Obrigado!

Razão: