Errores, fallos, preguntas - página 2759

 
Error en el depurador de MT5 (compilación 2450) activación incorrecta de los puntos de interrupción establecidos manualmente:
void test(){
   if(false){
      int i = 1;      // вручную установленная точка останова
   }   
}                     // место срабатывания точки останова при отладке

void OnStart(){
   test();   
}


UPD:
Gracias por la crítica, volvió al proyecto original y destacó el problema encontrado sin la sobre-optimización del 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:
Error en el depurador de MT5 (compilación 2450) activación incorrecta de los puntos de interrupción establecidos manualmente:

¿Puede explicar por qué tiene que pasar por todas estas molestias?

if(false)
¿Utilizas el depurador?
 
Sergey Chalyshev:

¿Puede explicar por qué tenemos que retorcer el código de esta manera?

¿Utilizas la depuración?

El código muestra un BAG en el que no se puede introducir la condición, pero el punto de interrupción sigue activándose en un lugar completamente diferente del código.
¿Más preguntas?

 

Escribe el siguiente mensaje al soporte de descubrimiento.

Probé el robot en una historia. Obtuve algunos resultados extraños. La parte inferior de la tabla está en la captura de pantalla. Si se tiene en cuenta que opero con 100.000 rublos, el saldo negativo de -6049 con una reducción del 17% parece increíble. Efectivamente, cuando abroel gráfico probando este conjunto de parámetros, obtengo un saldo positivo en la reducción especificada. La cuenta es real 75287 (como se ve en la foto). ¿Cuál puede ser la razón de este comportamiento del programa?

También puedo añadir que todos los conjuntos de parámetros se comportan de esta manera.

Tengo la respuesta:

Desgraciadamente, estas cuestiones no entran en el ámbito de la asistencia técnica.

Póngase en contacto con los desarrolladores del terminal.

¿Cuál podría ser la razón?

 
Sergey Dzyublik:

El código muestra un BAG en el que no se puede introducir una condición, pero aún así activa un punto de interrupción en un lugar completamente diferente del código.
¿Más preguntas?

Todo me parece correcto. El programa ignora if(false) y se dispara en el lugar más cercano por código).

 
TraSer:

Me parece que todo es correcto. El programa ignora if(false) y se dispara en el lugar más cercano del código).

Esto no es correcto en absoluto. Si necesito parar sólo cuando se cumpla una condición, y la parada se producirá en cada tick, me volveré loco mientras...

 
Sergey Dzyublik:

¿Alguna otra pregunta?

¿qué te hace pensar que el compilador no ha tirado el texto de la condición if(false) {....} al compilar el proyecto?

un punto de interrupción aparece en el primer carácter de texto de ME del resto del código porque ME no puede desplazar cadenas, pliegues y otras maravillas de VS

ME no puede analizar el código en tiempo real, a lo sumo hay autosustituciones

aunque si es un fallo, es un fallo

 
Igor Makanu:

¿qué te hace pensar que el compilador no ha tirado el texto de la condición if(false) {....} al compilar el proyecto?

el punto de ruptura estaba en el primer carácter de texto de ME del resto del código porque ME no puede desplazar cadenas, pliegues y otras maravillas de VS

ME no puede analizar el código en tiempo real, a lo sumo hay autosustituciones

pero si es un error, es un error.

Tienes que probarlo con una condición normal. El otro día me pasó esto: al ejecutar el código paso a paso

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

en el depurador, con una condición explícita que no se cumple, las llamadas a la función no se ejecutaron, pero el retorno; sí. He decidido que como no hay más código después del paréntesis curvo y sólo hay un paréntesis curvo más que termina void OnTick(), el compilador ha movido return

 
Alexey Viktorov:

Esto debe ser probado con una condición normal.

Sí, a eso me refiero, no a lo falso, sino a algo parecido:

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

normalmente el compilador no ve tal condición al compilar

 
Gracias por la crítica, volví al borrador original y destaqué el problema encontrado sin sobreoptimizar el 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
}