포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 263

 
evillive :

정수 매스[];


그런 다음 필요한 경우 주기를 채우십시오.

ArrayResize(질량,크기);

ArrayInitialize(Mas,0);

"그런 다음 순환 채우기"
아주 어렵지 않다면, 작은 예가 가능한가요?
 
Leo59 :
"그런 다음 순환 채우기"
아주 어렵지 않다면, 작은 예가 가능한가요?


 double MACDBuffer[]; int x=20;       // если известен размер буфера то              
 ArrayResize( MACDBuffer ,x);         // то можно и просто  MACDBuffer[20], но  MACDBuffer[] нельзя.
  double min,max;
 int start(){
     for ( int i= 0 ; i< 20 ; i++)
      MACDBuffer[i]= iMA ( NULL , 0 , 12 , 0 , MODE_EMA , PRICE_CLOSE ,i)- iMA ( NULL , 0 , 26 , 0 , MODE_EMA , PRICE_CLOSE ,i);
    min= ArrayMinimum (MACDBuffer);
    max= ArrayMaximum (MACDBuffer);
     Print (min, "____" ,max);
 }

동적 배열 MACDBuffer[] 를 채우려면 정적 ArrayResize()로 만들어야 한다고 들었습니다(그렇지 않으면 할당 결과는 항상 0이 됨).

그리고 계산의 적정성에서 안정성을 확보하려면 ArrayInitialize()로 배열을 초기화하는 것이 좋습니다.

 
ALXIMIKS :


동적 배열 MACDBuffer[] 를 채우려면 정적 ArrayResize()로 만들어야 한다고 들었습니다(그렇지 않으면 할당 결과는 항상 0이 됨).

그리고 계산의 적정성에서 안정성을 확보하려면 ArrayInitialize()로 배열을 초기화하는 것이 좋습니다.


고맙습니다!
결론은 일하는 전문가가 있다는 것입니다.
intCD=0; // 마감된 거래의 시퀀스 번호
이중 균형=0; // 마감된 거래의 결과
더블마스[]; // 마감된 거래 결과 값의 배열


int Start()에서 닫힌 거래의 결과로 Mas[]를 채우는 방법은 무엇입니까?

init() 및 deinit()에서 무언가를 등록해야 합니까? 초기화 또는 다른 것?
코드는 어떻게 보여야 합니까?

 
Leo59 :
결론은 일하는 전문가가 있다는 것입니다.
intCD=0; // 마감된 거래의 시퀀스 번호
이중 균형=0; // 마감된 거래의 결과
더블마스[]; // 마감된 거래 결과 값의 배열


int Start()에서 닫힌 거래의 결과로 Mas[]를 채우는 방법은 무엇입니까?

init() 및 deinit()에서 무언가를 등록해야 합니까? 초기화 또는 다른 것?
코드는 어떻게 보여야 합니까?

모든 사람은 "올바른"에 대한 자신의 정의를 가지고 있습니다.

아마도 초기화와 함께 init Mas[10000]에 만족하고 시작 시 CD 값이 변경되면 할당 Mas[CD]=Balance ?

또는 각 트랜잭션(잔액, 시간, 포인트, 최대 자산, 최소 자산 ...)에 필요한 모든 데이터가 저장되는 2차원 배열을 원할 수도 있습니다.

 
ALXIMIKS :


동적 배열 MACDBuffer[] 를 채우려면 정적 ArrayResize()로 만들어야 한다고 들었습니다(그렇지 않으면 할당 결과는 항상 0이 됨).

그리고 계산의 적정성에서 안정성을 확보하려면 ArrayInitialize()로 배열을 초기화하는 것이 좋습니다.

ArrayResize() 는 배열의 크기를 조정합니다. mql4에서 모든 배열은 기본적으로 정적입니다.
 
artmedia70 :
ArrayResize()는 배열의 크기를 조정합니다. mql4에서 모든 배열은 기본적으로 정적입니다.

틀렸어. 교과서는 다음을 확인합니다.

1차원 초기화 배열의 크기를 지정하지 않으면 초기화 시퀀스의 크기에 따라 컴파일러에서 결정합니다. 표준 ArrayInitialize() 함수를 사용하여 배열을 초기화할 수도 있습니다. 모든 배열은 정적입니다. 초기화 중에 명시적으로 지정되지 않은 경우에도 정적 형식을 갖습니다. 이것은 배열의 모든 요소가 배열이 선언된 함수의 실행 호출 사이에 값을 유지한다는 것을 의미합니다.

그러나 왜 그러한 "정적"배열은 값을 할당하지 않습니까??? 컴파일러의 ArrayResize (buffer,0)로 인해 결과가 예상대로 0입니까?

 int start(){
   double buffer[];
   for ( int i= 10 ;i>= 0 ;i--){
      buffer[i]=i;
       Print ( "buffer[i]=" ,buffer[i]);
   }
}
 
ALXIMIKS :

틀렸어. 교과서는 다음을 확인합니다.

그러나 왜 그러한 "정적"배열은 값을 할당하지 않습니까??? 컴파일러의 ArrayResize(buffer,0)로 인해 결과가 예상대로 0입니까?

배열이 동적이기 때문입니다. 첫 번째 차원의 크기는 1차원 배열의 경우 ArraySize() 함수를 사용하고 다차원 배열의 지정된 차원의 경우 ArrayRange()를 사용하여 볼 수 있습니다.

정적은 "기본 크기"를 의미하지 않습니다. "정적"과 "동적"이라는 두 개념을 비교하지 마십시오. 이것은 반의어가 아닙니다. 여기에서 그들은 다양한 적용 분야에서 왔습니다. 유추: 정적 배열은 " 정적 변수 "입니다. 동적 배열은 "프로그래밍 방식으로 설정 및 변경할 수 있는 크기"입니다.

 int start(){
   double buffer[];
   for ( int i= 0 ;i< 10 ;i++){
       ArrayResize (buffer,i+ 1 );
      buffer[i]=i;
       Print ( "Размер массива = " +( string ) ArraySize (buffer)+ ", Значение в buffer[" +( string )i+ "] = " ,buffer[i]);
   }
   return ( 0 );
}
 
Leo59 :

고맙습니다!
결론은 일하는 전문가가 있다는 것입니다.
intCD=0; // 마감된 거래의 시퀀스 번호
이중 균형=0; // 마감된 거래의 결과
더블마스[]; // 마감된 거래 결과 값의 배열


int Start()에서 닫힌 거래의 결과로 Mas[]를 채우는 방법은 무엇입니까?

init() 및 deinit()에서 무언가를 등록해야 합니까? 초기화 또는 다른 것?
코드는 어떻게 보여야 합니까?

마감된 거래의 모든 결과는 계정 내역에서 볼 수 있습니다. 프로그래밍 방식으로. 그리고 끊임없이 그들과 함께 배열을 망치질하십시오 - 그것이 필요합니까? 많이 있을 수 있습니다. 역사의 필요한 깊이로 자신을 제한하고 그것 없이는 절대적으로 살 수 없다면 배열을 채우는 것이 좋습니다.
 
얘들 아, 안드로이드에서 RSI에 보조 레벨을 추가하는 방법을 아는 사람이 있습니까?
 
ALXIMIKS :

틀렸어. 교과서는 다음을 확인합니다.

그러나 왜 그러한 "정적"배열은 값을 할당하지 않습니까??? 컴파일러의 ArrayResize(buffer,0)로 인해 결과가 예상대로 0입니까?


정확히 말하면 배열이 아니기 때문입니다. 더 자세한 내용을 원하시면 C 언어에 대한 설명을 참조하십시오 개발자가 처음부터 명확하지 않거나 불완전하게 언급된 모든 것에 대해서는 C 표준을 참조하라고 말했기 때문에 참조하지 않습니다.

그리고 "손가락 위"인 경우: 변수 선언 시 double buffer[]; 그런 다음 C에서 "포인터"라고 하는 하나의 변수에 대해 메모리가 할당되고, 이 변수는 정수 유형을 가지며 나중에 어레이가 시작될 메모리 셀의 주소 를 저장합니다. MCL을 사용하여 버퍼 변수의 차원을 확인하면 값이 0이 됩니다. 즉, 배열 자체에 할당된 메모리가 없으며 값을 할당하려고 하면 단순히 쓸 곳이 없습니다. : MCL에는 주소 산술이 없으며 포인터로 작업할 수 없습니다. C로 작성하는 것이 가능하지만 "할당되지 않은" 메모리를 사용하면 일반적으로 시스템 충돌이 발생합니다. AreaResize(array, N), (N>0)을 적용하면 배열(적어도 하나의 요소)에 메모리가 할당되고 값을 쓸 장소가 있습니다. 그런 다음 확인할 때 배열의 차원이 0과 다릅니다.

C 용어에서 정적 배열의 개념은 몇 가지 의미를 갖습니다.

1. 정적 배열(및 정적 변수/유형)은 컴파일 단계(MKL4용 사전 컴파일)에서 차원이 알려진 변수/배열입니다. 예를 들어, 이중 버프[10000]를 설명할 때; 컴파일러는 변수의 크기를 알려주고 즉시 메모리를 할당할 수 있습니다. 이 개념과 대조적으로 "동적 배열"이라는 개념이 있습니다. 즉, 컴파일 단계에서는 차원이 알려지지 않고 프로그램 실행 단계에서만 알려지게 되는 이러한 배열은 모두 변수의 배열입니다. 치수. 이러한 배열에 액세스할 때 먼저 메모리를 할당해야 합니다. 메모리는 프로그램 정적 메모리 외부에 할당됩니다.

C/C++에서 배열이 블록에 설명되면 가시성은 블록으로 제한됩니다(정적 배열이든 동적 배열이든). 로컬로 설명되는 동적 배열은 "메모리 누수"와 같은 프로그램의 오류와 관련이 있습니다. 이는 범위를 벗어나 메모리 포인터가 파괴되고 할당된 메모리가 계속 점유된 경우입니다.

2 정적 수정자로 설명된 변수로서의 "정적" 배열의 개념 - 이러한 변수는 블록 범위를 벗어날 때 파괴되지 않으며 별도의 메모리 영역에 위치하므로 값이 저장됩니다. 그들 안에. 메모리 누수 위험이 줄어듭니다. 1절의 의미에서 동적으로 선언된 배열(즉, 컴파일 단계에서 차원을 알 수 없는 배열)은 2절의 의미에서 정적일 수 있습니다. 즉, "정적" 수정자로 선언됩니다.

프로그램이 종료되면 메모리 누수를 방지하기 위해 동적으로 할당된 메모리를 해제해야 합니다. MKL의 개발자들이 이것을 따르고 있는지는 모르겠지만 그들의 프로그램에서는 항상 메모리를 확보합니다. - C의 습관 - ArrayResize(array, 0);

MKL에서 모든 배열은 항목 2의 의미에서 정적입니다.

이제 귀하의 질문에 대해: "정적 배열을 이중 버퍼[] 에 할당할 수 없는 이유는 무엇입니까?". 할당된 메모리가 없기 때문입니다(사실, 정적 수정자가 있는 동적 배열입니다). 값을 할당하기 전에 메모리를 할당해야 합니다. 즉, 0보다 큰 차원을 가진 ArrayResize를 이 배열에 적용해야 합니다. 어레이의 경우 할당된 메모리(어레이 외부)의 유출을 제어해야 합니다.

추신 나는 내가 그것을 분명히했기를 바랍니다. 최대한 간단하게 만들려고 노력했습니다.

사유: