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

 
Yurixx :

말해 주세요.

표시기에서 예를 들어 시리즈의 순서입니다. close[]는 ArraySetAsSeries()에 의해 한 번 또는 다른 방법으로 설정됩니까?

이것은 OnCalculate()에서 수행됩니까 아니면 OnInit()에서 수행할 수 있습니까?

나는 이상한 상황에 빠졌습니다.

첫 번째 틱의 항목에서 AS_SERIES에 의해 설정된 close[]의 순서는 다음 틱에서 자연스럽게 정상으로 변경됩니다. !AS_SERIES.

코드에서 무엇과 연결되어 있는지 찾지 못했습니다.

스칼라 &arr[] 수신하는 모든 함수에서 배열 인덱싱 방향에 대해 100% 확신할 수는 없습니다.

또한 내부에서 "직렬화"를 변경하면 함수가 완료된 후에도 이 방향이 유지됩니다. 이는 부작용으로 밝혀져 아무도 예상하지 못한 놀라움을 선사합니다.

따라서 불행히도 함수에 대한 입력에서 배열을 수신할 때 배열의 직렬성을 기억하고 편리한 배열로 설정하고 함수를 종료할 때 항상 원래의 배열을 반환합니다.

OnCalculate에서는 드문 경우지만 실제로는 다른 코드에서도 호출되는 경우가 있습니다.

 
Maxim Kuznetsov :

또한 내부에서 "직렬화"를 변경하면 함수 완료 후에도 이 방향이 유지됩니다.

이것이 바로 내가 기대했던 것입니다. 따라서 첫 번째 항목에서 한 번만 실행되는 블록의 OnCalculate()ArraySetAsSeries (닫기, 참) 를 넣었습니다. 그리고 이 "직렬화"가 실제로 확립되었습니다. 그러나 놀랍게도 두 번째 틱 이후에는 "시리즈"가 이미 반대였습니다.

막심 쿠즈네초프 :

OnCalculate에서는 드문 경우지만 실제로는 다른 코드에서도 호출되는 경우가 있습니다.

나는 그런 이국적인 것이 없으며 또한 프로그램 내에서 시계열 및 버퍼 배열의 "직렬화"를 변경하지 않습니다. 따라서 지표의 시작 부분에 한 번만 설정하면 충분합니다. 그러나 이러한 배열의 "직렬화"가 유지되는지 확신할 수 없는 경우 각 OnCalculate() 주기의 시작 부분에 설정해야 합니다. 완전히 부자연스러운 것 같습니다.

 
input string inStr = NULL ; // Входная строка не может быть NULL, но об этом нигде не сообщается.

#define PRINT(A) Print ( #A + " = " + ( string )(A));

void OnStart ()
{
   string Str = NULL ;
  
  PRINT(inStr == NULL ); // false
  PRINT(Str == NULL );   // true


  PRINT(inStr == "" ); // true
  PRINT(Str == "" );   // false
}
컴파일 타임에 경고를 생성하는 것이 좋습니다.
 
fxsaber :
컴파일 타임에 경고를 생성하는 것이 좋습니다.

고대 이후로 아무것도 변경되지 않았다면 NULL != "" 많은 사람들이 이미 이것을 발견했습니다.

 
Alexey Viktorov :

고대 이후로 아무것도 변경되지 않았다면 NULL != "" 많은 사람들이 이미 이것을 발견했습니다.

그것은 다른 것에 관한 것입니다.

 
fxsaber :

그것은 다른 것에 관한 것입니다.

그런 다음 왜 안되는지 설명하십시오. 왜

 input string inStr = "";

아마도

 input string inStr = NULL ;

그럴 수 없다.

 
Alexey Viktorov :

그런 다음 왜 안되는지 설명하십시오.

아래 스크립트는 이것을 보여줍니다.

 
fxsaber :

아래 스크립트는 이것을 보여줍니다.

보여줬다면 질문이 없었을 것이다. 당신은 항상 당신 주변의 모든 사람들이 당신의 생각을 읽어야 한다고 생각하거나 프로그래밍에서 당신보다 더 준비해야 한다고 생각합니다.

 
Alexey Viktorov :

보여줬다면 질문이 없었을 것이다. 당신은 항상 당신 주변의 모든 사람들이 당신의 생각을 읽어야 한다고 생각하거나 프로그래밍에서 당신보다 더 준비해야 한다고 생각합니다.

나는 그런 반응의 이유를 이해하지 못한다. 간결한 코드는 기능을 100% 보여줍니다.

 
fxsaber :

나는 그런 반응의 이유를 이해하지 못한다. 간결한 코드는 기능을 100% 보여줍니다.

정상적인 반응입니다. 귀하의 코드를 이해하지 못하여 설명을 요청했지만 응답으로...

NULL은 매우 모호하므로 신중하게 처리해야 합니다. 특히 문자열 변수에 적용될 때.

문서에서

 //--- если строка не инициализирована, то присвоим ей наше предопределенное значение 
if (some_string== NULL ) some_string= "empty" ;

따라서 이 예에서 NULL은 문자열의 길이 가 0이라는 의미가 아니라 변수가 초기화되지 않았음을 의미합니다.

귀하의 예에서

 input string inStr = NULL ;

변수가 초기화됩니다. 나에게 명확하지 않은 것은 무엇이며 이해하려는 욕구가 없습니다.

따라서

PRINT(inStr == NULL ); // false

변수가 초기화되었음을 나타냅니다. 다시 말하지만, 가장 큰 질문은 무엇입니까? NULL로 초기화하는 것이 불가능하다고 생각한 이유는 무엇입니까?

분명히 그러한 초기화는 문자열의 길이가 0이라는 사실로 이어지며, 이것이 이 검사가 말하는 것입니다.

PRINT(inStr == "" ); // true
사유: