변수의 행동에 대한 오해

 

내가 전문가처럼 컴파일하면

그런 다음 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()가 작동한다는 것은 분명합니다.

문제는 2. 다른 조건에 관계없이 변수가 업데이트된다는 것입니다.

업데이트 조건은 없지만 업데이트가 진행 중입니다!

 
StringVal을 변경하면 처음도 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 :

비슷한 예를 들어

첫 번째 변수의 값은 두 번째 변수에 한 번만 전달되고 두 번째 변수의 값은 프로그램을 추가로 실행하는 동안 변경되지 않아야 합니다 .

그러나 첫 번째 변수가 변경될 마다 두 번째 변수도 변경됩니다 .

extern 변수가 변경되면 EA가 다시 시작되어 전역 수준에서 선언된 변수가 초기화됩니다. 모든 것이 맞습니다. 이것을 피하려면 전역 변수를 사용하십시오.
 
Sepulca :
extern 변수가 변경되면 EA가 다시 시작되어 전역 수준에서 선언된 변수가 초기화됩니다. 모든 것이 맞습니다. 이것을 피하려면 전역 변수를 사용하십시오.

잘못된 - 초기화가 완료되지 않았습니다.

여기 참조의 증거가 있습니다.

전역 변수는 프로그램이 클라이언트 터미널의 메모리에 로드된 직후에 한 초기화됩니다.

그리고 일반적으로 초기화에 관한 것이 아니라 변수를 변경 하는 것에 관한 것입니다.

코드를 주의 깊게 읽으십시오

 

문제는 문자열 유형의 변수에서만 발생합니다.

다른 유형은 문제가 없습니다!

 
wlad :

여기 두 번째 변형이 있습니다

변수는 첫 번째 할당 후 메모리의 동일한 위치를 가리키는 것으로 밝혀졌습니다.

이 퀴노아가 어떤 빌드에서 뻗어나가는지 알고 싶습니다.


여기 예가 있습니다

항상 StringVal != backup 조건이 있고 firsttime은 항상 true 입니다 . (초기화)는 한 번만 시작 되지만 어드바이저를 다시 시작할 때마다 그리고 tf 창이 변경될 때 새 시작이 발생합니다. 터미널이 시작될 때 변경됩니다. 즉, StringVal 을 변경하면 init를 다시 실행합니다.