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

 
printf ( "%s , %f , %i" ,( string ) NULL ,( double ) NULL ,( int ) NULL );

2020.01.27 01:15:57.859 tst (EURUSD,H1) (널) , 0.000000 , 0

유형 캐스팅 을 제거하면 'NULL' 오류가 발생합니다. 'void' 유형의 표현식이 잘못되었습니다.

흥미롭게도 nput 문자열을 void로 초기화할 수 있음이 밝혀졌습니다.

 
fxsaber :

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

NULL / NIL(다른 용어로)은 문자열 상수 엔터티의 초기화가 될 수 없습니다.

적어도 mql 문자열은 C에서와 같이 "포인터"가 아니기 때문입니다. "아무것도 없음"이라는 특별한 상태가 없습니다.

추신 (아, 어떻게, 나는 이것을 나 자신에게서 기대하지 않았다)

 
Maxim Kuznetsov :

그녀는 "전혀"라는 특별한 상태가 없습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

mql5 언어의 특징, 미묘함 및 작업 방법

fxsaber , 2020.01.26 15:54

 void OnStart ()
{
   uchar Bytes[];

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

나는 매일 이 상태를 사용한다.

 
Maxim Kuznetsov :

적어도 mql 문자열은 C에서와 같이 "포인터"가 아니기 때문입니다. "아무것도 없음"이라는 특별한 상태가 없습니다.

추신 (아, 어떻게, 나는 이것을 나 자신에게서 기대하지 않았다)

아아, 아니요, MQL의 문자열은 할당된 메모리가 있는 엔터티입니다. @Ilyas 는 StringBufferLen()이 문자열의 길이를 표시하지 않을 수 있지만 문자열을 저장하기 위해 할당된 메모리를 정확히 표시하는 이유를 설명했습니다.


fxsaber :

나는 매일 이 상태를 사용한다.

표시기가 전혀 아니라 StringConcatenate()를 사용하여 MQL4의 모든 객체에 대한 포인터를 인쇄했습니다. 내장 함수의 작업은 MQL 규칙에 따라 구현되지 않습니다)))

 input string s = NULL ;
void OnStart ()
{
   uchar Bytes[];
   Print ( StringToCharArray ( NULL , Bytes));   // 0
   Print ( StringToCharArray ( "" , Bytes));     // 1
   Print ( StringToCharArray (s, Bytes));     // 1
}
 
Igor Makanu :

표시기가 전혀 아니라 StringConcatenate()를 사용하여 MQL4의 모든 객체에 대한 포인터를 인쇄했습니다. 내장 함수의 작업은 MQL 규칙에 따라 구현되지 않습니다)))

내부가 어떻든 상관없습니다.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

mql5 언어의 특징, 미묘함 및 작업 방법

이고르 마카누 , 2020.01.26 22:27

 input string s = NULL ;
void OnStart ()
{
   uchar Bytes[];

   Print ( StringToCharArray (s, Bytes));     // 1
}
NULL이 아니기 때문입니다. 이것이 원래 게시물의 내용이었습니다.
 
fxsaber :

내부가 어떻든 상관없습니다.

귀하의 사례로 내 게시물을 업데이트했습니다.


또한 입력 문자열 s = NULL로 몇 번 실험했습니다.

내가 이해하는 한, 우리가 입력 변수의 값을 사용하려고 하지 않는 동안 이 값은 NULL이 될 것이지만, 그 순간에 이 입력 변수의 값을 다른 변수에 할당하거나 단순히 이 입력 변수를 인쇄하려고 하면 , 이 NULL은 사라집니다. 즉 . 이 입력 문자열 변수 에 메모리가 할당됩니다 .

 
Igor Makanu :

내가 이해하는 한, 우리가 입력 변수의 값을 사용하려고 하지 않는 동안 이 값은 NULL이 될 것이지만, 그 순간에 이 입력 변수의 값을 다른 변수에 할당하거나 단순히 이 입력 변수를 인쇄하려고 하면 , 이 NULL은 사라집니다. 즉 . 이 입력 문자열 변수 에 메모리가 할당됩니다 .

입력 변수의 작동 메커니즘은 위에서 자세히 설명했습니다.

 
fxsaber :

내부가 어떻든 상관없습니다.

NULL이 아니기 때문입니다. 이것이 원래 게시물의 내용이었습니다.

(여전히) 역참조 엔터티의 작업(관계)의 세부 사항이 있습니다(mql에는 포인터가 없고 C가 아닙니다. 엔터티가 있어야 함)

입력은 시작할 때 선언된 그러한 const입니다. 물리적으로 "NOTHING" 값을 지정할 수 없습니다.

const string nothing=NULL; /// <--- ЭТО ЧТО ?

 
Nikolai Semko :

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

MQL5 항목:

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

어떻게 변수에 메모리가 할당되지 않습니까?
메모리가 할당되고 변수에 임의의 쓰레기가 포함됩니다.
그리고 문자열에 값이 표시되지 않는다는 사실은 버퍼가 비어 있는 것이 논리적입니다.

 char    ch; 
short   sh;
int     in;
double db;       
string st;

Print ( sizeof (ch));
Print ( sizeof (sh));
Print ( sizeof (in));
Print ( sizeof (db));
Print ( sizeof (st));
Print ( "---------------------" );
Print (ch);
Print (sh);
Print (in);
Print (db);
Print (st);
 
Roman :

어떻게 변수에 메모리가 할당되지 않습니까?
메모리가 할당되었지만 변수에 임의의 쓰레기가 포함되어 있지 않습니다.
그리고 문자열에 값이 표시되지 않는다는 사실은 버퍼가 비어 있는 것이 논리적입니다.

 char ch; 
short sh;       
string st;

Print ( sizeof (ch));
Print ( sizeof (sh));
Print ( sizeof (st));

   string str1;
   string str2= "Однажды, в студёную зимнюю пору я из лесу вышел; был сильный мороз." ;
   Print ( sizeof (str1));   // 12
   Print ( sizeof (str2));   // 12
   uchar ch1[],ch2[];
   Print ( StringToCharArray (str1, ch1));   // 0
   Print ( StringToCharArray (str2, ch2));   // 68
사유: