Erros, bugs, perguntas - página 1681

 
Karputov Vladimir:
Não faz qualquer diferença se as citações vão ou estão de pé. É necessário controlar a condição prev_calculate==0 no indicador - este é o modo de troca de histórico e o segundo ponto - modo de recálculo de barras alteradas, ou seja de facto taxas_total -prev_calculate+1.

Deve-se ler o que está escrito antes de responder. O código para reproduzir o bug do depurador! São fornecidos todos os dados para a sua reprodução.

Aqui está um guião para reproduzir o mesmo erro

int Func(){ return(0); }

int Func2()
{
//  return(0); // если расскоментировать и здесь поставить точку останова, то отладчик отработает, как надо  
  return(Func()); // здесь поставить точку останова (F9)
}

void OnStart()
{
  Func2();
}
 
fxsaber:
Deve-se ler o que está escrito antes de responder. Código para reproduzir o bug do depurador! São fornecidos todos os dados para reprodução.

Respondi-lhe - não lhe interessa quantas vezes a OnCalculate é chamada. A sua tarefa é fornecer um recálculo total ou parcial do indicador, analisando dois valores: taxas_total, prev_calcular e a condição quando prev_calcular==0.

Não há nenhuma condição estrita de que a OnCalculate() deva ser chamada uma ou duas vezes. OnCalculate() não deve nada a ninguém. Mas o programador deve controlar dois valores: taxas_total, prev_calcular e a condição quando prev_calcular==0.

 
Karputov Vladimir:
Eu disse-vos - não vos interessa quantas vezes a OnCalculate é chamada. A sua tarefa é fornecer um recálculo total ou parcial do indicador, analisando dois valores: taxas_total, prev_calcular e a condição quando prev_calcular==0.

Interessa-me quantas vezes é chamado o depurador e quantas vezes é chamado OnCalculate. Sou uma PESSOA PREMIUM por natureza! E eu preocupo-me com tudo.

Está a tentar ensinar-me algo sem compreender a essência do problema. Obrigado, é claro. Mas ouçamos e ouçamos o nosso adversário.

 
fxsaber:

Nah, estou agora a correr na RTS, quando os kotirs estão de pé. Descobriu que é chamado uma vez e o depurador mente, mostrando como se fossem dois. Código para jogar (correr numa personagem onde não há carraças)

Depois de pressionar F5 atingirá um ponto de ruptura. E depois de uma segunda imprensa em F5 - de forma semelhante. Embora isto não deva ser - como confirmação, pode encurtar essa linha no código e tentar com ela.

É assim que se pode ver o que está errado. Observe o valor de i na primeira e segunda paragens.

int Func(int& i)
{
        i++;
        return 0;
}

int OnCalculate( const int rates_total,
                 const int prev_calculated,
                 const datetime &time[],
                 const double &open[],
                 const double &high[],
                 const double &low[],
                 const double &close[],
                 const long &tick_volume[],
                 const long &volume[],
                 const int &spread[] )
{
        int i = 1;
        return(Func(i)); // здесь поставить точку останова (F9)
}
 
Sergei Vladimirov:

É desta forma que se pode ver qual é o problema. Rastrear o valor i na primeira e segunda paragens.

Rastreei-o, foi por isso que o escrevi.

Descobriu que é chamado uma vez, mas o depurador está a mentir, mostrando-o como se fossem dois.

Porque é que o depurador me devolve ao mesmo lugar depois da segunda imprensa na F5? Tal coisa não acontece com a devolução(0), o que é correcto.

 

Não mente, pára duas vezes - antes de calcular a expressão entre parênteses, e depois, imediatamente antes do regresso.

A propósito, um truque muito útil, na minha opinião. Preciso de me lembrar disso. Não há necessidade de colocar o resultado entre parênteses numa variável separada para verificar o valor de retorno antes da saída, o depurador em si vai parar novamente.

 
Sergei Vladimirov:

Não mente, pára duas vezes - antes de calcular a expressão entre parênteses, e depois, imediatamente antes do regresso.

A propósito, um truque muito útil, na minha opinião. Preciso de me lembrar disso.Não há necessidade de colocar o resultado entre parênteses numa variável separada para verificar o valor de retorno antes da saída, o depurador em si vai parar pela segunda vez.

Eu concordaria que isto é conveniente. Mas como descobrir o resultado do retorno antes da saída sem uma variável no depurador?
 
fxsaber:


Coloque o código desta forma:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int i=1;
   Print("Перед: i ",i,",rates_total ",rates_total,", prev_calculated ",prev_calculated);
   int rezult=Func(i);
   Print("После: i ",i,",rates_total ",rates_total,", prev_calculated ",prev_calculated);
   return(rezult); // здесь поставить точку останова (F9)
  }

e colocar o indicador no gráfico. E depois recarregar o terminal (não é necessário remover o indicador do gráfico). Verá que OnCalculate() pode ser chamado uma ou duas ou mesmo três vezes. Isto é, como disse acima - não há regras estritas.

 
Karputov Vladimir:

Coloque o código desta forma:

e colocar o indicador no gráfico. E depois recarregar o terminal (não é necessário remover o indicador do gráfico). Verá que OnCalculate() pode ser chamado uma ou duas ou mesmo três vezes. Isto é, como disse acima - não há regras estritas.

Obriga-me a queixar-me de si como sendo completamente indisponível para ouvir o que o seu oponente escreve.
 
fxsaber:
Eu concordaria que isto é útil. Mas como posso saber o resultado do retorno antes da saída sem uma variável no depurador?

Olha no corpo Func() para veres o que regressa antes de saíres. Estou a falar de um caso especial. Se o valor for calculado directamente entre parênteses, é claro que não pode.

PS. Embora... Porque não? Na segunda paragem, procurar todos os argumentos de retorno() e calcular o resultado. )