错误、漏洞、问题 - 页 1681

 
Karputov Vladimir:
报价是去还是站,没有任何区别。你需要在指标中控制prev_calculate==0的条件--这是历史交换和第二点--对变化的条形图重新计算的节约模式,这实际上是rate_total -prev_calculate+1。

你应该在回复之前阅读所写的内容。重现调试器错误的代码!所有用于复制的数据都已给出。

下面是一个重现相同错误的脚本

int Func(){ return(0); }

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

void OnStart()
{
  Func2();
}
 
fxsaber:
你应该在回答之前阅读所写的内容。重现调试器错误的代码!所有用于复制的数据都已给出。

我回答了你--你并不关心OnCalculate被调用 多少次。你的任务是通过分析两个值:Rates_total、prev_calculate和prev_calculate==0时的条件,来提供指标的全部或部分重新计算。

没有严格的条件规定OnCalculate()必须被调用一次或两次。OnCalculate()并不欠任何人什么。但程序员必须控制两个值:Rates_total、prev_calculate和prev_calculate==0时的条件。

 
Karputov Vladimir:
我告诉过你--你并不关心OnCalculate被调用 多少次。你的任务是提供指标的全部或部分重新计算,分析两个值:rate_total,prev_calculate和prev_calculate==0时的条件。

我关心调试器被调用多少次,OnCalculate被调用多少次。我本质上是一个了不起的人!而我对一切都很关心。

你试图教我一些东西,却不了解问题的本质。当然,谢谢你。但让我们听一听,听一听我们的对手。

 
fxsaber:

不,我现在是在RTS上运行,当kotirs站着的时候。发现它被调用了一次,而调试器却在说谎,显示好像是两次。播放代码(在一个没有滴答声的角色上运行)。

在按下F5后,它将会碰到一个断点。而在第二次按下F5后--类似的情况。虽然这不应该是--作为一种确认,但你可以缩短代码中的那一行,用它来试试。

这样你就能看到什么是错的。观察第一和第二站的i的值。

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:

这就是你可以看到问题所在的方法。追踪第一和第二站的i值。

追踪它,这就是我写它的原因。

发现它被调用了一次,但调试器在撒谎,显示它好像是两次。

为什么在第二次按F5后,调试器会将我退回到同一个地方?在return(0)中没有这样的事情发生,这是对的。

 

它没有说谎,它停了两次--在计算括号内的表达式之前,以及在它之后,就在返回之前。

顺便说一下,在我看来,这是一个非常方便的技巧。我需要记住它。不需要把结果放在括号里,在退出前检查返回值,调试器本身会再次停止。

 
Sergei Vladimirov:

它没有说谎,它停了两次--在计算括号内的表达式之前,以及在它之后,就在返回之前。

顺便说一下,在我看来,这是一个非常方便的技巧。我需要记住它。不需要把结果放在括号里,在退出前检查返回值,调试器本身会第二次停止

我同意,这很方便。但如何在调试器中没有变量的情况下找出退出前的返回结果?
 
fxsaber:


把代码写成这样。

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)
  }

并将该指标放在图表上。然后重新加载终端(你不需要从图表中删除指标)。你会看到OnCalculate()可以被调用一次或两次甚至三次。也就是说,正如我上面所说--没有严格的规则。

 
Karputov Vladimir:

把代码写成这样。

并将该指标放在图表上。然后重新加载终端(你不需要从图表中删除指标)。你会看到OnCalculate()可以被调用一次或两次甚至三次。也就是说,正如我上面所说--没有严格的规则。

你迫使我抱怨你完全不愿意听你的对手所写的东西。
 
fxsaber:
我同意,这很方便。但是,在调试器中没有变量的情况下,我怎样才能找出退出前的返回结果?

在Func()体中查看它在退出前返回的内容。我说的是一个特殊情况。如果数值将直接在括号内计算,当然不能。

PS。虽然...为什么不呢?在第二站,查找所有参数return()并计算结果。)