错误、漏洞、问题 - 页 2759

 
MT5调试器(build 2450)中的错误,不正确地触发了手动设置的断点:
void test(){
   if(false){
      int i = 1;      // вручную установленная точка останова
   }   
}                     // место срабатывания точки останова при отладке

void OnStart(){
   test();   
}


UPD:
谢谢你的批评,回到原来的项目,强调了遇到的问题,没有对代码进行过度优化:
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:
MT5调试器(build 2450)中的错误,不正确地触发了手动设置的断点:

你能不能解释一下,为什么你要费尽心思?

if(false)
你使用调试器吗?
 
Sergey Chalyshev:

你能解释一下为什么我们要这样扭曲代码吗?

你使用调试吗?

代码中显示了一个不能进入条件的BAG,但断点 仍然在代码中一个完全不同的地方触发。
还有问题吗?

 

写了以下信息给开放支持服务。

在一个故事上测试了机器人。得到了一些奇怪的结果。表格的底部部分在截图上。如果你考虑到我用10万卢布进行交易,-6049的负余额和17%的缩水似乎令人难以置信。的确,当我打开测试 这组参数的图表 时,我在指定的缩减量上得到了一个正的余额。该账户是真实的75287(如照片中所示)。程序的这种行为的原因可能是什么?

我还可以补充说,所有的参数集都是这样的行为。

得到了答案。

不幸的是,这类问题不属于技术支持的范围。

请联系该终端的开发者。

可能的原因是什么?

 
Sergey Dzyublik:

代码中显示了一个不能输入条件的BAG,但仍然在代码中一个完全不同的地方触发了一个断点。
还有问题吗?

在我看来,一切都很正确。程序忽略了if(false),并在离它最近的地方触发了代码)。

 
TraSer:

在我看来,一切都很正确。程序忽略了if(false)并在代码中最接近的地方触发)。

这一点也不正确。如果我需要在满足某个条件时才停止,而停止是在每一个刻度 上,我就会发疯,而...

 
Sergey Dzyublik:

还有什么问题吗?

你为什么认为编译器在编译项目时没有扔掉if(false)条件{....}的文本?

一个断点 出现在代码其余部分的第一个ME文本字符上,因为ME不能转移字符串、折叠和其他VS的奇迹

ME不能实时分析代码,最多是自动替代。

虽然这是一个错误,但它是一个错误。

 
Igor Makanu:

你为什么认为编译器在编译项目时没有扔掉if(false)条件{....}的文本?

断点是在代码其余部分的第一个ME文本字符处,因为ME不能转移字符串、折叠和其他VS奇迹。

ME不能实时分析代码,最多是自动替代。

但如果它是一个错误,那就是一个错误。

你必须在正常条件下进行测试。有一天我得到了这个消息:当一步步执行代码时

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

在调试器中,在一个明确的条件没有被满足的情况下,函数调用 没有被执行,但返回;是。我决定,由于在弧形括号之后没有更多的代码,而且只有一个弧形括号终止了void OnTick(),编译器已经将return

 
Alexey Viktorov:

这应该在正常情况下进行测试。

是的,这就是我所说的,不是假的,而是类似的东西。

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

通常,编译器在编译时不会看到这样的条件。

 
谢谢你的批评,回到原稿,强调了遇到的问题,没有过度优化代码:
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
}