初学者的问题 MQL5 MT5 MetaTrader 5 - 页 497

 

谢谢,但我以前读过第一个链接,第二个链接证实了我写代码时使用的逻辑。

然而,我对第二个链接中的这句话感到困惑:"......。在这个循环之外还有一个同名的变量..."由此可见,尽管在区块内部会声明一个同名的新变量,但全局变量的值仍然保持不变,但这是无稽之谈,因为如果你声明一个新变量,前者的值就会被抹去,那么我不明白,使用和存储两个不同的变量(局部和全局),但值相同,有什么意义?

 
-Aleks-:

谢谢,但我以前读过第一个链接,第二个链接证实了我写代码时使用的逻辑。

然而,我对第二个链接中的这句话感到困惑:"......。在这个循环之外,还有一个同名的变量... "但这是无稽之谈,因为如果你声明一个新的变量,前者的值就会被抹去,那么我就不明白了,使用和存储两个不同的变量(局部和全局),但数值相同,有什么意义?

在我看来,你是在写胡话。如果你在一个循环或函数内声明一个局部变量,同名的全局变量的值 不会受到影响,但编译器会警告你,你声明的局部变量与现有的全局变量同名,在一个范围包括新声明的变量的函数或代码块内工作,不会影响全局变量的值。它警告你这一点,以便你理解这是一个新的变量,这样你就不会期望全局变量的值在你离开你声明了一个与现有全局变量同名的新变量的块的范围后发生变化。

简单地说:公寓内的一切都适用于所有房间,并由所有房间共享(全局变量)。而在一个房间内的所有东西--它只适用于这个房间,从其他房间不可见(它是一个局部变量)。

甚至更简单?请。

如果你把厕所里的空气弄乱了(局部),那就是弄乱了。同时,整个单位(全球)都知道(由于你的厕所实验),最好不要进入厕所......。但空气是整个单位的概念,所有居民都知道厕所里的空气变质。同时,只有在厕所里的幸运儿才能充分体验到在封闭空间内改变局部环境的所有乐趣(变量值的局部影响)。我们其余的人知道,但不觉得。当你离开厕所时,你失去了在厕所里经历的感觉(局部值),开始呼吸新鲜空气(得到空气的全局值),同时和其他人一样,知道裤子里有一脚(空气污染功能的结果,影响到整个单位的整体生活)...

我希望我已经说得很清楚了

 
Artyom Trishkin:

我认为你在胡乱写。如果你在一个循环或函数内声明一个局部变量,同名的全局变量的值 不会被覆盖,但编译器会警告你,你声明了一个与现有全局变量同名的局部变量,在范围包括新声明的变量的函数或代码块内工作,不会影响全局变量的值。它警告你这一点,以便你理解这是一个新的变量,这样你就不会期望全局变量的值在你离开你声明了一个与现有全局变量同名的新变量的块的范围后发生变化。

简单地说:公寓内的一切都适用于所有房间,并由所有房间共享(全局变量)。而在一个房间内的所有东西--它只适用于这个房间,从其他房间不可见(它是一个局部变量)。

甚至更简单?请。

如果你把厕所里的空气弄乱了(局部),那就是弄乱了。同时,整个单位(全球)都知道(你的厕所实验的结果),最好不要进厕所......但空气是整个单位的概念,所有居住者都知道厕所里的空气变质。同时,只有在厕所里的幸运儿才能充分体验到在封闭空间内改变局部环境的所有乐趣(变量值的局部影响)。我们其余的人知道,但不觉得。当你离开厕所时,你失去了在厕所里经历的感觉(局部值),开始呼吸新鲜空气(得到空气的全局值),同时和其他人一样,知道裤子里有一脚(空气污染功能的结果,影响到整个单位的整体生活)...

我希望我已经说得很清楚了

在你的著作中发现了真理--谢谢你!事实证明,在一个区块内声明一个与全局变量同名的变量,会导致在区块内锁定全局变量的数据。而且关于已经声明的变量的警告也不能被删除,对吗?
 
-Aleks-:
在你的著作中发现了真理--谢谢你!事实证明,在一个区块内声明一个与全局变量同名的变量,会导致区块内全局变量的数据被屏蔽...而关于已经声明的变量的警告不能被删除,对吗?
对。
 
Artyom Trishkin:
void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int        i,limit;
   static int weightsum=0;
   double     sum=0;
//---
   if(prev_calculated==0)
     {
      limit=MA_Period+begin;
      //--- set empty value for first limit bars
      for(i=0; i<limit; i++) LineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      LineBuffer[limit-1]=firstValue;
     }
   else
     {
      limit=prev_calculated-1;
     }
 
   for(i=limit;i<rates_total;i++)
     {
      sum=0;
      for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
      LineBuffer[i]=sum/weightsum;
     }
//---
  }
参考文献中的说法不正确
 
-Aleks-:

谢谢,但我以前读过第一个链接,第二个链接证实了我写代码时使用的逻辑。

然而,我对第二个链接中的这句话感到困惑:"......。在这个循环之外,还有一个同名的变量..."但这是无稽之谈,因为如果你声明一个新的变量,前者的值就会被抹去,那么我就不清楚,使用和存储两个不同的变量(局部和全局),但数值相同,有什么意义?

不幸的是,它写得不正确。

void CalculateLWMA(int rates_total,int prev_calculated,int begin,const double &price[])
  {
   int        i,limit;
   static int weightsum=0;
   double     sum=0;
//---
   if(prev_calculated==0)
     {
      limit=MA_Period+begin;
      //--- set empty value for first limit bars
      for(i=0; i<limit; i++) LineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(int i=begin; i<limit; i++)
        {
         int k=i-begin+1;
         weightsum+=k;
         firstValue+=k*price[i];
        }
      firstValue/=(double)weightsum;
      LineBuffer[limit-1]=firstValue;
     }
   else
     {
      limit=prev_calculated-1;
     }
 
   for(i=limit;i<rates_total;i++)
     {
      sum=0;
      for(int j=0; j<MA_Period; j++) sum+=(MA_Period-j)*price[i-j];
      LineBuffer[i]=sum/weightsum;
     }
//---
  }
 
pako:

不幸的是,那里拼错了 :(

好吧,好吧,你能不能用字母做输出,因为我现在认不出这个代码。
 
pako:
它在帮助中没有说清楚。
你为什么要给我密码?我不知道该在其中寻找什么......而且我没有太多的时间。你能告诉我这是做什么用的,帮助有什么问题吗?
 
Artyom Trishkin:
你为什么要给我密码?我不知道该在其中寻找什么.........而我又受时间限制。你能告诉我这是做什么用的,帮助中的错误是什么。

是帮助中的代码

是 "i "在函数的开头。

然后在循环中又是 "i"。

 
pako:

是帮助中的代码

是 "i "在函数的开头。

然后在循环中它又是 "i"。

好在没有错误:一个带有全局 i 的循环(蓝色),另一个带有局部 i 的循环(红色)。

if(prev_calculated==0)
     {
      limit=MA_Period+begin;
      //--- set empty value for first limit bars
      for(i=0; i<limit; i++) LineBuffer[i]=0.0;
      //--- calculate first visible value
      double firstValue=0;
      for(int i=begin; i<limit; i++)
        {                           
         int k=i-begin+1;           
         weightsum+=k;              
         firstValue+=k*price[i];    
        }                           
      firstValue/=(double)weightsum;
      LineBuffer[limit-1]=firstValue;
     }