Erros, bugs, perguntas - página 786

 

Algo foi estragado na última construção. .ex5 de um dos indicadores cresceu em tamanho quase 10 vezes em comparação com o .ex5 compilado pela construção anterior. Bem, não é um problema. Mas apareceu um erro ao desenhar o indicador (antes de introduzir os seus parâmetros):

2012.07.27 02:53:57     MP2012_GRI (EURUSD,M30) Access violation read to 0x000000003FF39D25

Já fixei o código 3\4. E se eu voltar a comentar um pouco, vou obtê-lo (juntamente com o erro acima):

2012.07.27 02:56:42     Custom Indicator        'MP2012_GRI' may work incorrectly, as it requires more than 256Kb of stack memory
e realmente não funciona

E se volto a comentar um pouco os dois primeiros erros desaparecem, mas recebo-os quando descarrego o indicador:

2012.07.27 02:47:35     MP2012_GRI (EURUSD,M30) 9 leaked strings left
(Os números podem ser diferentes - depende de quanto código eu comentei)

Descobri de antemão, que a minha função é demasiado grande por volume - vou bater em pequenas funções.

...e tudo estava bem na última construção

 
notused:

Algo foi estragado na última construção. .ex5 de um dos indicadores cresceu em tamanho quase 10 vezes em comparação com o .ex5 compilado pela construção anterior. Bem, não é um problema. Mas apareceu um erro ao desenhar o indicador (antes de introduzir os seus parâmetros):

Já fixei o código 3\4. E se eu mudar um pouco mais, eu vou (juntamente com o erro acima):

Reforçámos o controlo sobre o ambiente da caixa de areia em prol de uma melhor segurança.

A mensagem sobre a pilha diz-lhe que utilizou mais de 256 kilobytes de pilha numa das suas funções, o que é um problema grave na programação. Por exemplo, em C/C++ usando uma função de pilha local mesmo para 16Kb é considerado um aviso sério.

É provável que afecte uma grande quantidade de matrizes estáticas em funções, por exemplo:

void func(void)
  {
   double arr1[128000];
   double arr2[128000];
   double arr3[128000];

  }

Não deve fazer isso.

Se precisar de matrizes grandes, use melhor matrizes dinâmicas. Por exemplo:

double ExtArr[];

void func(void)
  {
   double arr1[];
   double arr2[];

   ArrayResize(ExtArr,128000,0);
   ArrayResize(arr1,128000,0);
   ArrayResize(arr2,128000,0);
  }
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat:

Reforçámos o controlo sobre o ambiente da caixa de areia em prol de uma maior segurança.

A mensagem sobre a pilha diz-lhe que utilizou mais de 256 kilobytes numa função da pilha, o que é um problema sério na programação. Por exemplo, em C/C++ usando uma pilha local até 16 kb numa função, é considerado um aviso sério.

É provável que afecte uma grande quantidade de matrizes estáticas em funções, por exemplo:

Não deve fazer isso.

Se precisar de matrizes grandes, use matrizes dinâmicas em vez disso. Por exemplo:

Não uso arrays estáticos de todo neste indicador; não passo nada mais pesado do que int em funções, etc. Mas utiliza activamente todo o tipo de funções gráficas.

Por exemplo,

   ObjectSetString(0, stmp, OBJPROP_TEXT, "HB");
   ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

Se a última linha for comentada, está tudo bem. O problema é que existem muitas chamadas deste tipo e esta

ObjectSetInteger(0, stmp, OBJPROP_COLOR, hbColor);

é o 20º ou 30º de uma fila.

Penso que o problema reside no tamanho da função, uma vez que comentar o código evita o problema, enquanto a maior parte do código consiste em ObjectSetXXX. Descobri através de experiências que quebrá-lo em partes mais pequenas também é inútil - um inliner agressivo ainda vai empilhar tudo e gerar erros. Posso tentar colocar mais código, mas fá-lo-ei amanhã. O balcão de atendimento é também amanhã, se não o descobrirmos mais cedo.

 
notused:

Não uso arrays estáticos de todo neste indicador; não passo nada mais pesado do que int em funções, etc. Mas todos os tipos de funções gráficas são activamente utilizadas.

Mas há algo enorme, não há?

Por exemplo, incluir uma cópia local de uma classe que apenas tem uma tonelada de matrizes estáticas nos seus membros. Normalmente é aí que se escondem os depósitos dos consumidores da pilha local.


Por exemplo,

Se a última linha for comentada, está tudo bem. O problema é que temos muitas chamadas deste tipo e esta

é o 20º ou 30º de uma fila.

Penso que o problema está no tamanho da função, já que comentar o código evita o problema, e a maior parte do código consiste em ObjectSetXXX. Descobri através de experiências que quebrá-lo em partes mais pequenas também é inútil - um inliner agressivo ainda vai empilhar tudo e gerar erros. Posso tentar colocar mais código, mas fá-lo-ei amanhã. O Service Desk também amanhã, se não o descobrirmos antes.

Dividir funções, empilhar em classes.

A Inliner muito provavelmente não tem nada a ver com isto - não insere peças demasiado grandes de código. Especialmente se forem pesadas/grandes parcelas de variáveis locais.

 
Renat:

Mas há algo enorme, não há?

Por exemplo, incluir uma cópia local de uma classe que apenas tem uma tonelada de matrizes estáticas nos seus membros. É normalmente onde se escondem os depósitos dos consumidores da pilha local.


Dividir funções, empilhar em classes.

O Inliner provavelmente não tem nada a ver com isto - não insere pedaços demasiado grandes de código. Especialmente se tiverem pesos/gramas de variáveis locais.

Balcão de serviço #444495
 

Porque é assim ? pagamento desleixado ou quê ! apenas 1 agente ganhou 1 kr e 0,3 kr foi pago por dia !


 

Não se esqueça de escrever para Servicedesk com estes cabeçalhos:

Versão terminal e taxa de bits

...

Descrição do problema

...

Sequência de acções ...

...

Resultado obtido ...

...

Resultado esperado ...

...

Informação adicional ...

...

Ou pode colocá-lo nas suas próprias palavras?

 
Zeleniy:

ou pode pôr tudo isto nas suas próprias palavras?

Uma lista seria melhor. Isto tornará a vida muito mais fácil para quem quer que esteja a lidar com o insecto.
 
Zeleniy:

Tem de escrever para Servicedesk com estas rubricas?


ou posso fazê-lo com as minhas próprias palavras?

pode fazer tudo com as suas próprias palavras, mas

Versão terminal e taxa de bits
Descrição do problema

Sequência de acção
Resultado obtido
Resultado esperado

necessariamente.

------------

Não está a escrever um ensaio sobre um assunto livre, está a escrever um texto para um revelador que deve compreender rapidamente o que quer dele sem quaisquer detalhes.

 
sergeev:

pode fazer tudo por si, mas

Versão terminal e taxa de bits
Descrição do problema

Sequência de acção
Resultado obtido
Resultado esperado

necessariamente.

------------

Não está a escrever um ensaio sobre um assunto livre, está a escrever um texto para um programador que deve compreender rapidamente o que quer dele sem quaisquer detalhes.

Escolhi a secção Site mql5.com e a proposta e agora não compreendo como anexá-la aos títulos.