Erros, bugs, perguntas - página 2759

 
Bug in MT5 debugger (build 2450) disparo incorrecto de pontos de interrupção definidos manualmente:
void test(){
   if(false){
      int i = 1;      // вручную установленная точка останова
   }   
}                     // место срабатывания точки останова при отладке

void OnStart(){
   test();   
}


UPD:
Obrigado pelas críticas, voltou ao projecto original e realçou o problema encontrado sem uma optimização excessiva do código:
class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}
 
Sergey Dzyublik:
Bug in MT5 debugger (build 2450) disparo incorrecto de pontos de interrupção definidos manualmente:

Pode explicar por favor porque tem de passar por todo este trabalho?

if(false)
Utiliza o depurador?
 
Sergey Chalyshev:

Pode explicar porque temos de torcer o código desta forma?

Utiliza a depuração?

O código mostra um BAG onde a condição não pode ser introduzida, mas o ponto de quebra ainda dispara num lugar completamente diferente no código.
Mais perguntas?

 

Escreveu a seguinte mensagem para o serviço de apoio à abertura.

Testou o robô sobre uma história. Obteve alguns resultados estranhos. A parte de baixo da tabela está na imagem do ecrã. Se considerarmos que negoceio com 100.000 rublos, o saldo negativo de -6049 com 17% de levantamento de crédito parece inacreditável. De facto, quando abroo gráfico testando este conjunto de parâmetros, obtenho um saldo positivo no sorteio especificado. A conta é real 75287 (como se vê na foto). Qual poderá ser a razão de tal comportamento do programa?

Posso também acrescentar que todos os conjuntos de parâmetros se comportam desta forma.

Já tenho a resposta:

Infelizmente, tais questões não estão no âmbito do apoio técnico.

Por favor contacte os programadores do terminal.

Qual poderia ser a razão?

 
Sergey Dzyublik:

O código mostra um BAG onde uma condição não pode ser introduzida, mas mesmo assim desencadeia um ponto de quebra num local completamente diferente no código.
Mais perguntas?

Tudo me parece correcto. O programa ignora se(falso) e dispara no local mais próximo por código).

 
TraSer:

Parece-me que tudo está correcto. O programa ignora se(falso) e dispara no local mais próximo no código).

Isto não é de todo correcto. Se precisar de parar apenas quando uma condição for preenchida, e a paragem for em cada carrapato, enlouquecerei enquanto...

 
Sergey Dzyublik:

Alguma outra pergunta?

o que o leva a pensar que o compilador não deitou fora o texto da condição if(false) {....} ao compilar o projecto ?

um ponto de quebra aparece no primeiro carácter de texto ME do resto do código porque o ME não pode deslocar cordas, dobras e outras maravilhas VS

ME não pode analisar código em tempo real, na maioria das autosubstituições estão disponíveis

embora se for um insecto, é um insecto

 
Igor Makanu:

o que o leva a pensar que o compilador não deitou fora o texto da condição if(false) {....} ao compilar o projecto ?

o ponto de quebra foi no primeiro carácter de texto ME do resto do código porque o ME não pode deslocar cordas, dobras e outras maravilhas VS

ME não pode analisar código em tempo real, na maioria das autosubstituições estão disponíveis

mas se é um insecto, é um insecto.

É preciso testá-lo com uma condição normal. Recebi isto no outro dia: ao executar o código passo a passo

  if(desiredProfit > 0 && summProfit > desiredProfit)
   {
    CloseAllPosition();
    DeleteAllPending();
    openSeries = Should_I_open;
    return;
   }

no depurador, com uma condição explícita não sendo cumprida, as chamadas de função não foram executadas, mas sim devolvidas; é. Decidi que como não há mais código após o suporte curvo e só há mais um suporte curvo a terminar o vazio OnTick(), o compilador moveu o retorno

 
Alexey Viktorov:

Isto deve ser testado com uma condição normal.

Sim, é disso que estou a falar, não é falso, mas algo do género:

int i=1;
if(--i == 0)...

normalmente o compilador não vê uma tal condição quando compila

 
Obrigado pela crítica, voltou ao projecto original e realçou o problema encontrado sem optimizar demasiado o código:
class A{
public:
   bool m_flag;
   A* m_next;
   A(bool flag) : m_flag(flag){}
   
   void test(){
      if(m_flag){
         printf("1");
         m_next = m_next;    // Вручную установленная точка останова срабатывает как для false так и true условий
         //m_next = &this;   // Ok
      }   
   }
};

void OnStart(){
  {A a(false); a.test();}   // Result: breakpoint              Expected result: 
  {A a(true);  a.test();}   // Result: printf + breakpoint     Expected result: printf + breakpoint
}