変数の動作に関する混乱

 

エキスパートとしてコンパイルすると

で、StringValを変更すると、すぐにバックアップが変更されます。

と呼ばれ、最後のPrintは

どこに問題があるのか?

extern string StringVal = "string";

       string backup = "";

int init() {
   Print("=========================");
   Print("StringVal=",StringVal,"    backup=",backup);
   if(StringVal != backup){
      backup = StringVal;
      Print("StringVal=",StringVal,"< > backup=",backup);
   }
}

int start() { }
 

第二の選択肢はこれだ

最初の代入の後、変数が同じメモリ位置を指していることが判明しました。

 if(firsttime) { backup = StringVal; 

これはどのようなものなのでしょうか?


一例です

extern string StringVal = "string";

       string backup    = "";
       bool   firsttime = true;
       
int init() {
   Print("=========================");
   Print("StringVal=",StringVal,"    backup=",backup);
 
   if(StringVal != backup){
      if(firsttime) { backup = StringVal; Print(" First Call ===> backup = StringVal"); }
      Print("StringVal=",StringVal,"< > backup=",backup);
   }
   firsttime = false;
}

int start() {  }
 
wlad:

エキスパートとしてコンパイルすると

で、StringValを変更すると、すぐにバックアップが変更されます。

と呼ばれ、最後のPrintは

どこに問題があるのか?


まあ、手動でStringValを変更すれば、すぐにinitは動作するわけですが......その 通りです。
 

init()が動作することは明らかです。

問題は、2.他の条件とは無関係に変数が更新されることです

アップデートの条件がないのに、アップデートが行われます。

 
StringValを変更したら、同時にfirsttimeをfalseに変更する
 

Yes, it's all clear

問題は、2.他の条件と関係なく変数が設定されること

ALWAYS

大問題

 

以下はその一例です。

第一の変数の値が第二の変数に一度だけ 渡され、第二の変数の値はプログラムのさらなる実行時に 変更 されないこと。

が、1つ目の変数が変わるたびに2つ目の変数の値が変わる のは、 本来なら

extern string Value = "O";
       
string temp_="";
bool   firsttime=true;
       
int start() {
   string txt=StringConcatenate( "  Value: ",Value,"\n",
                                 "  temp_: ",temp_,"\n",
                                 "  firsttime: ",firsttime);    
   if(firsttime) { temp_=Value; firsttime=false; } // значение присваевается тольо ОДИН раз   

   Print(txt);
   Comment(txt);                              
}
 
wlad:

以下はその一例です。

第一の変数の値が第二の変数に一度だけ 渡され、第二の変数の値はプログラムのさらなる実行時に 変更 されないこと。

が、1つ目の変数が変わるたびに2つ目の変数の値が変わる のは、 本来なら

extern変数が変更されるたびにEAが再起動されるため、グローバルレベルで宣言された変数が初期化されることになる。これは正しい。これを避けたい場合は、Global Variablesを 使用します。
 
Sepulca:
extern変数が変更されるとEAが再起動し、グローバルレベルで宣言されている変数が初期化される。これは正しい。これを避けたい場合は、Global Variablesを 使用します。

誤 - 初期化を全く行わない

以下は、ヘルプにある証明です。

グローバル変数の初期化は、プログラムがクライアント端末のメモリにロードされた直後に一度だけ 行われます。

また、一般的には、初期化ではなく、変数の変更について

コードをよくお読みください

 

また、この問題は文字列 型の変数のみで発生します

他のタイプでも問題なし!

 
wlad:

第二の選択肢はこれだ

最初の代入の後、変数が同じメモリ位置を指していることが判明しました。

これはどのようなものなのでしょうか?


以下はその一例です。

の場合、StringVal != backup となり、 init は一度だけ起動 れますが、 EA を再起動するたびに、また情報ウィンドウを変更するときやターミナル起動時の セットを変更するときに新たに起動されるので、firsttime は常に true となります。そのため StringValを 変更すると 、再びinitが開始 されます。

理由: