对变量的行为感到困惑

 

如果我以专家的身份进行编译

那么当我改变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
 

是的,这一切都很清楚

问题是,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:

这里有一个类似的例子

第一个变量的值只传递给第二个变量一次,第二个变量的值在程序的进一步执行 中不应改变

但每当第一个变量被改变时,第二个变量的值也会改变,这 不应该

每当外部变量发生变化时,EA就会重新启动,这就导致了在全局水平上声明的变量的初始化。这一点是正确的。如果你想避免这种情况,请使用全局变量
 
Sepulca:
当外部变量被改变时,EA被重新启动,这导致了在全局水平上声明的变量的初始化。这是正确的。如果你想避免这种情况,请使用全局变量

错--根本没有初始化

这里是帮助中的一个证明

全局变量 被初始化一次,就在程序加载到客户终端的内存之后。

而一般来说,这不是初始化的问题,而是改变 一个变量的问题

请仔细阅读代码

 

而且问题只发生在字符串 类型的变量上

对于其他类型的产品没有问题!

 
wlad:

这里是第二个选项

事实证明,在第一次赋值之后,这些变量都指向同一个内存位置。

我想知道这是哪家公司的产品。


下面是一个例子

你总是有StringVal != backup, firsttime将总是真实的,因为它(init)只启动一次,但 每次你重新启动EA,当你改变信息窗口或当你改变终端启动 设置时,一个新的启动 所以当你改变 StringVal ,你又开始启动