오류, 버그, 질문 - 페이지 167

 

동적 배열 에 대한 질문

이중 open_main_array[] - 클래스 변수

초기화

ArraySetAsSeries(open_main_array,true);

이 코드가 있는 첫 번째 함수 호출

CopyOpen(Symbol(), PERIOD_M15, 0, 개수, open_main_array);

두 번째 함수 호출

CopyOpen(Symbol(), PERIOD_M15, 0, 개수, open_main_array);

open_main_array 배열에 2차 호출에서 복사된 데이터가 포함됩니까, 아니면 배열이 커지고 1차 및 2차 호출의 데이터가 포함됩니까?

따라서 다음을 사용할 수 있습니다.

ArrayFree(open_main_array)

CopyOpen(Symbol(), PERIOD_M15, 0, 개수, open_main_array);

Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
Документация по MQL5: Основы языка / Типы данных / Объект динамического массива
  • www.mql5.com
Основы языка / Типы данных / Объект динамического массива - Документация по MQL5
 
Renat :

초기화되지 않은 변수 - 변수가 초기화되지 않은 경우 통과 분기가 보장됨을 의미합니다. 예를 들어, 기본은 MainPrice가 명시적으로 초기화되어야 하는(또는 선언할 때 명시적으로 0이 되어야 하는) switch에서 명시적으로 생략됩니다.

"통과 보장"에 대해. 다음은 코드입니다.

            (1)         double local_low ;
            (2)         uint index_interior=i-k;
            (3)         bool interrupcion= false ;
            (4)         for ( uint n= 1 ;n<Ac-k;n++)
            (5)           {
            (6)             if (low[index_interior-n]<low[index_interior-n- 1 ])
            (7)              {
            (8)               local_low=low[index_interior-n];
            (9)               interrupcion= true ;
            (10)              break ;
            (11)              }
            (12)          }  
            (13)        if (interrupcion)
            (14)          {
            (15)            if (EspacioFalladoPlus0<high[index_interior]-local_low)
                       ...

마지막 줄(15행)에는 "초기화되지 않은 변수 'local_low' 사용 가능"이라고 나와 있습니다.

그러나 9행의 interrupcion bool 변수를 사용하기 때문에 8행 의 local_low 변수 초기화 직후 15행의 local_low 변수의 초기화가 보장 됩니다. 따라서 현재 "초기화되지 않은 변수 'local_low' 사용 가능"이라는 경고는 "보장됨"을 의미하는 것이 아니라 변수가 초기화되지 않은 통과 분기의 존재 가능성 만 의미합니다.

 
Yedelkin :

"통과 보장"에 대해. 다음은 코드입니다.

마지막 줄(15행)에는 "초기화되지 않은 변수 'local_low' 사용 가능"이라고 나와 있습니다.

그러나 9행의 interrupcion bool 변수를 사용하기 때문에 8행의 local_low 변수 초기화 직후 15행의 local_low 변수의 초기화가 보장 됩니다. 따라서 현재 "초기화되지 않은 변수 'local_low' 사용 가능"이라는 경고는 "보장됨"을 의미하는 것이 아니라 변수가 초기화되지 않은 통과 분기의 존재 가능성 만 의미합니다.

절대적으로 올바르게 경고를 발행합니다.

자신감 과 현실을 혼동하지 마십시오. 많은 프로젝트 를 거쳐 현실이 드러나고 "논리가 이러니까 그럴 수 없다"는 이해가 나날이 일어난다.

 
Renat :

자신감 을 현실과 혼동하지 마십시오. 많은 프로젝트를 거쳐 현실이 드러나고 "논리가 이렇기 때문에 그럴 수 없다"는 이해가 매일 일어난다.

충분한 설명이 가능한가요? 코드가 제공되고 "자신감 있는" 문구가 표시됩니다. 오류는 무엇입니까? 나는 이기주의를 이해하지 못한다.

..." 초기화되지 않은 변수의 가능한 사용"이라는 문구의 번역을 고려하면 실제로 "절대적으로 정확한" 경고가 발행됩니다. 그러나 "보장된" 것이 아니라 변수가 초기화되지 않은 통과 분기의 가능한 존재에 관한 것입니다. 그것이 바로 제가 말하는 "자신감"입니다.

 
Yedelkin :

충분한 설명이 가능한가요? 코드가 제공되고 "자신감 있는" 문구가 표시됩니다. 오류는 무엇입니까? 나는 이기주의를 이해하지 못한다.

그리고 만약 당신 대신

interrupcion=true;

(예를 들어)

interrupcion = (someFunction1(input) > someFunction2(input2)) && (someFunction3() < 1) || (someFunction1(input3) * someFunction3() > 10);
당신도 불만을 제기하시겠습니까? 특히 someFunctionN이 수백 줄의 코드로 구성되어 있다면?

코드에 따르면 - 예, 15번째 줄이 실행되면 변수가 초기화됩니다. 그러나 내가 준 예제에서 컴파일러에게 무엇을 하라고 말하겠습니까? 작업이 어렵습니다. 예, 해결할 필요가 없습니다.

그리고 오류는 "초기화되지 않은 변수의 가능한 (아마도) 사용"이라고합니다 (이미 알고 있지만)

그리고 local_low 변수의 값에 일부 스레드를 명시적으로 할당하는 것이 좋습니다. 저를 믿으세요. 이것은 미래에 발생할 수 있는 실수로부터 당신을 구할 수 있습니다(코드가 수정되고, 무언가가 삭제되고, 무언가가 이동되고, 무언가가 변경되고, 13행이 이 프로세스에서 빠질 수 있음)

 
Yedelkin :

충분한 설명이 가능한가요? 코드가 제공되고 "자신감 있는" 문구가 표시됩니다. 오류는 무엇입니까? 나는 이기주의를 이해하지 못한다.

실제 조건에서 모든 언어의 대다수 프로그래머가 절대적으로 안전하지 않고 버그가 있는 코드를 작성할 때 컴파일러는 가능한 한 엄격하게 만들어야 합니다. 프로그래머의 자신감은 "논리가 명확하고 문제가 없어야하며 모든 것이 원래대로 초기화됩니다"는 엄청난 수의 오류를 가져오고 가져올 것입니다.

따라서 엄격한 조치에 대한 비판에 대한 질문은 여기에서 적절하지 않습니다.

 
Renat :

... 프로그래머의 자신감 "논리가 명확하고 문제가 없어야하며 모든 것이 원래대로 초기화되어야합니다"가 가져오고 엄청난 수의 오류를 가져오고 가져올 것입니다.

따라서 엄격한 조치에 대한 비판에 대한 질문은 여기에서 적절하지 않습니다.

비판 없이 가자. 게다가 나는 그것을 내 말로 표현하지 않았다. 그리고 내 쪽에서 비판이 존재하는 것에 대해, 당신은 깊이 착각하고 있습니다.

무슨 일이야? 코드에 밀교를 삽입할 수 없으므로 논리 언어로 응답하십시오. 저것들. 모든 프로그래머가 이해할 수 있는 언어로.

 
notused :

당신도 불만 을 제기하시겠습니까? 특히 someFunctionN이 수백 줄의 코드로 구성되어 있다면?

그리고 당신이 거기에 있습니다. 글쎄, 나는 불만이 없다. 모든 것이 Renat이 주장하는 것처럼 범주적이지는 않다는 설명이 있습니다.

코드에 대해. 나는 일반적인 논리를 사용하여 Renat의 진술의 범주성을 논박하는 코드의 구체적인 예를 제시했습니다. 조언 감사합니다. 항상 개선하려고 노력하고 있습니다.

 
Yedelkin :

비판 없이 가자. 게다가 나는 그것을 내 말로 표현하지 않았다. 그리고 내 쪽에서 비판이 존재하는 것에 대해, 당신은 깊이 착각하고 있습니다.

무슨 일이야? 코드에 밀교를 삽입할 수 없으므로 논리 언어로 응답하십시오. 저것들. 모든 프로그래머가 이해할 수 있는 언어로.

" 초기화되지 않은 변수 'local_low'를 사용할 수 있습니다"

발행되는 경우

( 1 )         double local_low= 1.1 ; // или что-то другое
 
Yedelkin :

무슨 일이야? 코드에 밀교를 삽입할 수 없으므로 논리 언어로 응답하십시오. 저것들. 모든 프로그래머가 이해할 수 있는 언어로.

많은 소프트웨어 프로젝트 를 시장에 출시한 소프트웨어 회사 임원의 관점에서 내 답변을 다시 읽으십시오.

그렇지 않으면 "모든 프로그래머" 수준에 머물면서 실수가 무엇인지 이해하지 못할 것입니다.