错误、漏洞、问题 - 页 3129

 
Alexey Viktorov #:

在你的案例中,情况并非如此,因为两个条件都必须满足。但如果你把这个

那么,是的。如果条件 "a "得到满足,第二个条件将不会被检查。他们已经为之奋斗了很多年,现在你却提议回到上个世纪......

奇怪的是,在a=true的情况下,不仅在||处,而且在&&处,都没有对其余部分进行检查。否则你怎么解释(不要在指标的操作中寻找意义,我们在这里说的是代码)。

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_ARROW
#property indicator_color1  Gray
#property indicator_label1  "Fractal Up"
//--- indicator buffers
double ExtUpperBuffer[];
//--- 10 pixels upper from high price
int    ExtArrowShift=-10;

void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA);
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_ARROW,217);
//--- arrow shifts when drawing
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift);
//--- sets drawing line empty value--
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);
  }

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[])
  {
   if(rates_total<5)
      return(0);

   int start;
//--- clean up arrays
   if(prev_calculated<7)
     {
      start=2;
      ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE);
     }
   else
      start=rates_total-5;

   for(int i=start; i<rates_total-3 && !IsStopped(); i++)
     {
      //--- Upper Fractal
      if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>high[i+3] && high[i]>high[i+4])
         ExtUpperBuffer[i]=high[i];
      else
         ExtUpperBuffer[i]=EMPTY_VALUE;
     }

   return(rates_total);
  }

终端是无声的。但如果你改变

if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>high[i+3] && high[i]>high[i+4])

if(high[i]>high[i+4] && high[i]>high[i+2] && high[i]>high[i+3] && high[i]>high[i+1])

程序员改变了它,出现了臭名昭著的"数组超出范围"的信息,因为程序员 立即偶然发现了一个索引过大的数组,这与第一种情况不同。

 
x572intraday #:

我不敢说这是个错误。所以我只想说,我注意到if 语句的一个特殊性。我怀疑这可能也适用于其他语言。

如果a为真,检查跳到Array[over_index],这里终端开始崩溃,通过'数组超出范围'的部分,这是非常真实的。但是如果a变成了假的,终端就不会检查Array[over_index]条件,因此也就不会检查索引冗余,如果 会进一步跳过,而编码者就不会知道在他的程序中存在一个索引不存在的数组......或者说是一个现有的但多余的。

也许应该有一个修复方法,以便对"数组超出范围" 的检查会进行到if 循环的最后,并输出相同的信息?或者它将大大降低操作者的速度?


在什么语言中,句法是不同的?"句法的字面意思是不仅要作曲,而且要安排......"。

如果你想检查是否有一个"数组超出范围",改变排序。

if(Array[over_index]>val && a) {...}
 
Lilita Bogachkova #:

在什么语言中,句法是不同的?"句法从字面上看,不仅是指作曲,而且是指排序......"

如果你想检查是否有一个"数组超出范围",改变顺序。

订购是可取的,因为你需要检查。

例如,如果'a'的变化比较频繁,最好把它作为第一个参数。

 
Vitaly Muzichenko #:

秩序是可取的,因为检查是必要的。

例如,如果 "a "的变化比较频繁,最好把它作为第一个参数。

不,第一个取决于主要条件,其他只是附加条件。

例如,如果工作时间还没有开始,检查当前工作时间的小时数是不相关的。
 

事实上,我是偶然发现这个功能的。这不是我想要的...。

if(high[i]>high[i+1] && high[i]>high[i+2] && high[i]>high[i+3] && ... && high[i]>high[i+n])

if(high[i]>high[i+1])
   if(high[i]>high[i+2])
      if(high[i]>high[i+3])
         if(...)
            if(high[i]>high[i+n])

麻烦的是,n可能相当大,所以我想把这一长串的条件包起来,变成一个紧凑的。我是这样试的。

for(int i=start; i<rates_total-3 && !IsStopped(); i++)
{
   bool h_plus=true; //false?
   for(int increment=1; increment<=n; increment++)
      h_plus&=high[i]>high[i+increment];
   if(h_plus) {...}
   ...
}

但结果是有点乱。至少因为采用这种算法的h_plus将不得不采取整个检查条件的总和,包括检查多余的索引数组的条件,这在第一个解包的if 中没有发生,没有for。而其他清漆则破坏了画面。

这甚至值得考虑吗?有可能做到这一点吗?

 
Lilita Bogachkova #:

在什么语言中,句法是不同的?"句法从字面上看,不仅是指作曲,而且是指排序......"。

如果你想检查是否有一个"数组超出范围",就改变顺序。

你并不总是事先知道该把什么放在前面,把什么放在后面。

 
Lilita Bogachkova #:

不,第一个决定了基本条件,其他的只是附加条件。

例如,如果工作时间还没有开始,检查当前工作时间的小时数是不相关的。

是的,首先我们检查信号条件,通过阵列和比较,检查当前价格,然后发现时间不对,但在此之前,要进行很多复杂的操作。

对吗?

 
Vitaly Muzichenko #:

是的,首先我们检查信号条件,通过阵列和比较,检查当前价格,然后发现时间不对,但在这之前已经做了很多复杂的动作。

对吗?

对, 你不应该这样做。
 
Vitaly Muzichenko #:

检查

谁告诉你上述条件中的 "a "总是假的?

 
x572intraday #:

事实上,我是偶然发现这个功能的。这不是我想要的...。

麻烦的是,n可能相当大,所以我想把这一长串的条件包起来,变成一个紧凑的。我是这样试的。

但结果是有点乱。至少因为采用这种算法的h_plus将不得不采取整个检查条件的总和,包括检查多余的索引数组的条件,这在第一个解包的if 中没有发生,没有for。而其他清漆则破坏了画面。

这甚至值得考虑吗?有可能过度换吗?

以下是我完全不明白的代码

for(int i=start; i<rates_total-3 && !IsStopped(); i++)
{
   bool h_plus=true; //false?
   for(int increment=1; increment<=n; increment++)
      h_plus&=high[i]>high[i+increment];
   if(h_plus) {...}
   ...
}

这段代码中的标记&是什么意思?那么应该在哪个循环中执行if(h_plus)?你没有错过任何弯曲的支架吗?