初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 497

 

ありがとうございます。しかし、最初のリンクは以前読んだことがあり、2番目のリンクは私がコードを書くときに使ったロジックを確認するものです。

しかし、2つ目のリンクにある「...」という記述には戸惑いを覚えます。このループの外側にも同じ名前の変数が あるのですが...。"それは、ブロック内の同じ名前の新しい変数が宣言されるという事実にもかかわらず、グローバル変数の値が同じままであることを次のように、あなたが新しい変数を宣言した場合、元の値が消去されるので、このナンセンス、私は理解していない、何を使用して、2種類の変数(ローカルおよびグローバル)が、同じ値を格納するポイントです?

 
-Aleks-:

ありがとうございます。しかし、最初のリンクは以前読んだことがあり、2番目のリンクは私がコードを書くときに使ったロジックを確認しました。

しかし、2つ目のリンクにある「...」という記述に戸惑いを感じます。このループの外側には、同じ名前の別の変数が あります..." しかし、これはナンセンスです新しい変数を宣言した場合、前の値は消去 されますので、私は理解していない、2つの異なる変数(ローカルとグローバル)を使用して格納することの意味は、同じ値ですか?

私の意見では、あなたはナンセンスなことを書いています。ループや関数の内部でローカル変数を宣言した場合、同じ名前のグローバル変数の値には 影響しませんが、コンパイラーは既存のグローバル変数と同じ名前のローカル変数を宣言したことを警告し、新しく宣言した変数をスコープに含む関数やコードブロックの内部で作業してもグローバル変数の値には影響しないことを警告します。これは、新しい変数であることを理解し、既存のグローバル変数と同じ名前の新しい変数を宣言したブロックのスコープを出た後に、グローバル変数の値が変わることを期待しないように、警告を表示するものです。

簡単に言うと、フラット内のものはすべて全室に適用され、全室で共有される(グローバル変数)。そして、部屋の中にあるものすべて - それは部屋にのみ適用され、他の部屋からは見えません(ローカル変数です)。

もっとシンプルに?お願いします。

トイレの空気を(局所的に)乱すと、そこが乱れるんです。一方、フラット全体(グローバル)では、(あなたのトイレ実験の結果)トイレに入らない方がいいということが分かっている...。しかし、空気はフラット全体の概念であり、トイレの空気が汚れていることは住人全員が知っていることです。同時に、トイレにいる幸運な人だけが、限られた空間の中で局所的な環境を変化させる楽しさ(変数の値の局所的な影響)を十分に味わうことができるのです。それ以外の人は知っていても、実感がない。トイレから出ると、トイレで体験した感覚(ローカル値)を失い、新鮮な空気を吸い始める(空気というグローバル値を得る)、一方で、他の人と同じように、キックがある(フラット全体の生活に影響する空気汚染機能の結果)ことを知る......という具合です。

おわかりいただけたでしょうか

 
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-:

ありがとうございます。しかし、最初のリンクは以前読んだことがあり、2番目のリンクは私がコードを書くときに使ったロジックを確認しました。

しかし、2つ目のリンクにある「...」という記述に戸惑いを感じます。このループの外側には、同じ名前の別の変数が あります..."しかし、このナンセンスは、新しい変数を宣言した場合、前者の値は消去されますので、それは私には明らかではない、2つの異なる変数(ローカルおよびグローバル)が、同じ値を使用して保存することのポイントは何ですか?

残念ながら、正しく書かれていません :(

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;
     }
理由: