mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 160

 
Alexey Viktorov :

NULL은 매우 모호하므로 신중하게 처리해야 합니다.

 void OnStart ()
{
   uchar Bytes[];

   Print ( StringToCharArray ( NULL , Bytes)); // 0
   Print ( StringToCharArray ( "" , Bytes));   // 1
}

다시 한 번, 입력 문자열은 NULL이 될 수 없습니다(강제 "" ). 나머지 줄 - 수 있습니다.

 
fxsaber :

다시 한 번, 입력 문자열은 NULL이 될 수 없습니다(강제 "" ). 나머지 줄 - 수 있습니다.

입력은 거의 const와 동의어이며 const는 초기화되어야 합니다.
 
fxsaber :

다시 한 번, 입력 문자열은 NULL이 될 수 없습니다(강제 "" ). 나머지 줄 - 수 있습니다.

다시 말하지만, 왜 그러한 변형이 되어서는 안 된다고 생각하십니까? 이 모든 것을 설명하기에는 내 지식과 경험이 충분하지 않습니다. 그러므로 당신의 의견을 고수하십시오. 개발자들이 계속해서 이것을 변경하지 않기를 바랍니다.

 
Alexey Viktorov :

다시 말하지만, 왜 그러한 변형이 되어서는 안 된다고 생각하십니까?

나는 왜 그러한 변화가 일어나는지 잘 알고 있습니다. 이것은 버그가 아니라 기능입니다.

 
Maxim Kuznetsov :
입력은 거의 const와 동의어이며 const는 초기화되어야 합니다.

NULL - 초기화. 의도적으로 이 예제는 비입력 문자열을 보여줍니다.

 
fxsaber :
컴파일 타임에 경고를 생성하는 것이 좋습니다.

예, 아마도 그러한 행동은 "바보로부터의 보호"일 것입니다.
입력 변수 를 초기화해야 한다는 사실을 고려할 때 변수가 메모리에서 이미 1바이트 이상을 차지할 때 input = NULL 은 인위적으로 ="" 와 동일하게 지정됨을 알 수 있습니다.

MQL5 항목:

 string str= NULL ;
string str;

절대적으로 동일합니다. 변수에 할당된 메모리가 없습니다. 아무튼 별 차이를 못 느꼈습니다.
예를 들어 자바에서는 두 경우 모두 변수에 할당된 메모리가 없음에도 불구하고 이러한 항목에는 약간의 차이가 있습니다. 변수에 할당된 메모리가 없지만 첫 번째 옵션(String str = null;)은 초기화된 것으로 간주되며 변수는 비어 있는 것으로 인쇄될 수 있습니다. 그리고 두 번째 경우(String str;)는 변수를 출력하려고 하면 초기화되지 않은 변수에 대한 오류가 발생합니다.
저것들. MQL5는 이 점에서 더 관대합니다.
어느 쪽이 더 나은지 저도 잘 모르겠습니다.

 
Nikolai Semko :

입력 변수 를 초기화해야 한다는 사실을 고려할 때 변수가 메모리에서 이미 1바이트 이상을 차지할 때 input = NULL 은 인위적으로 ="" 와 동일하게 지정됨을 알 수 있습니다.

NULL은 초기화가 아니라 값입니다. 코드 중간에 있는 모든 비 const 문자열 변수에 NULL을 할당할 수 있습니다. 그리고 그것은 NULL이 될 것입니다.

시작할 때 보이지 않는 세트 파일이 생성되기 때문에 입력은 NULL이 아닙니다. 그리고 이 파일에서 변수 값을 "파싱"하여 입력으로 이동합니다. 글쎄, 구문 분석은 어떤 경우에도 NULL을 생성할 수 없으므로 거기에 빈 문자열을 넣습니다.

이 동작은 입력 문자열에만 해당됩니다. const-string 및 나머지의 경우 - 물론 모든 것이 정상입니다.
 
fxsaber :

NULL은 초기화가 아니라 값입니다. 코드 중간에 있는 모든 비 const 문자열 변수에 NULL을 할당할 수 있습니다. 그리고 그것은 NULL이 될 것입니다.

시작할 때 보이지 않는 세트 파일이 생성되기 때문에 입력은 NULL이 아닙니다. 그리고 이 파일에서 변수 값을 "파싱"하여 입력으로 이동합니다. 글쎄, 구문 분석은 어떤 경우에도 NULL을 생성할 수 없으므로 거기에 빈 문자열을 넣습니다.

글쎄, 나는 같은 것에 대해 이야기하고 있습니다. 동의한다.
변수를 선언하는 단계에서 문자열에 NULL 값을 할당하는 것은 의미가 없습니다.

 string str1 = NULL ;
string str2;
PRINT((str1== NULL ));   // true
PRINT((str2== NULL ));   // true

메모리에서 이미 초기화된 변수를 재설정하는 경우에만 이 작업을 수행하는 것이 좋습니다.

 
Nikolai Semko :

글쎄, 나는 같은 것에 대해 이야기하고 있습니다. 동의한다.
변수를 선언하는 단계에서 문자열에 NULL 값을 할당하는 것은 의미가 없습니다.

메모리의 변수를 재설정할 때만 이 작업을 수행하는 것이 좋습니다.

 #define DEFAULT_VALUE NULL

string Str = DEFAULT_VALUE;

if (Str == DEFAULT_VALUE)
  ...

여기서 NULL 초기화가 의미가 있습니다.

 
fxsaber :

여기에서 NULL 초기화가 의미가 있습니다.