개인적으로 이런 경우에는 객체의 초기화 기능을 사용합니다.
먼저 배열이 생성되고 모든 매개변수를 설정할 수 있는 모든 배열 객체에 대해 Init() 함수가 호출됩니다.
별도의 함수로 초기화하면 객체를 재초기화할 수 있으며, 생성자에서 초기화하면 객체를 재초기화할 수 없습니다.
그리고 잠시. 포인터를 통해 개체 배열을 만드는 것이 좋습니다. 그렇지 않으면 스택 메모리에 매우 작은 배열을 얻습니다.
Strategy2 *pZ[]; if ( ArrayResize (pZ, 10 ) != 10 ) { Alert ( "Memory allocation error" ); return ; } for ( int i = 0 ; i < 10 ; ++i) { pZ[i] = new Strategy2( "EURUSD" ); if ( CheckPointer (pZ) == POINTER_INVALID ) { Alert ( "Class instantiation error" ); return ; } }
이것은 문제가 아니며 잠재적인 문제는 훨씬 적습니다. MT에서 메모리로 작업하는 기능만 있습니다. 다음은 정적 배열입니다.
#define ARRAY_SIZE int ( 60000000 ) class Test { public : int nA; double fB; datetime dtC; Test( void ) : nA( 0 ) , fB( 1.0 ) , dtC( __DATETIME__ ) { }; }; Test classTest[ARRAY_SIZE]; // 'classTest' - global variables section is too large void OnStart () { }
다음은 동적 배열입니다.
#define ARRAY_SIZE int ( 60000000 ) class Test { public : int nA; double fB; datetime dtC; Test( void ) : nA( 0 ) , fB( 1.0 ) , dtC( __DATETIME__ ) { }; }; Test *pClassTest[]; void OnStart () { if ( ArrayResize (pClassTest, ARRAY_SIZE) != ARRAY_SIZE) { Alert ( "Not enought memory" ); return ; } for ( int i = 0 ; i < ARRAY_SIZE; ++i) { pClassTest[i] = new Test(); if ( CheckPointer (pClassTest[i]) == POINTER_INVALID ) { Alert ( "Class instantiation error" ); return ; } } for ( int i = 0 ; i < ARRAY_SIZE; ++i) delete pClassTest[i]; }
이 경우 모든 것이 컴파일되고 작동합니다.
이것은 문제가 아니며 잠재적인 문제는 훨씬 적습니다. MT에서 메모리 작업의 기능만. 다음은 정적 배열입니다.
다음은 동적 배열입니다.
이 경우 모든 것이 컴파일되고 작동합니다.
스택은 어떻게 됩니까? 첫 번째 경우에는 컴파일 단계에서 정적으로 큰 메모리 블록을 힙에 할당하려고 시도했습니다. 이 블록에서 컴파일러로부터 이마를 받는 것이 당연했습니다. 너무 많은 메모리를 할당하거나 할당하지 않을 수 있습니다.
두 번째 경우에는 런타임에 이미 많은 메모리를 할당했습니다. 그리고 프로그램이 이미 특정 기계 리소스(메모리)로 작업하고 있기 때문에 할당이 가능한지 여부가 즉시 명확해집니다.
그리고 포인터는 무엇입니까? stat 동안 미리 정의된 두 가지 유형의 mql 배열. 컴파일 및 동적. * 포인터는 동적 배열뿐만 아니라 일반 클래스 필드도 가리킬 수 있습니다. 따라서 여기에서 포인터를 사용하는 것은 절대 정당화되지 않습니다.
추신 포인터, 클래스, 매크로와 같은 코드의 이상한 인상 - 무슨 일이 일어나고 있는지에 대한 완전한 이해 부족.
이것은 문제가 아니며 잠재적인 문제는 훨씬 적습니다. MT에서 메모리로 작업하는 기능만 있습니다. 다음은 정적 배열입니다.
다음은 동적 배열입니다.
이 경우 모든 것이 컴파일되고 작동합니다.
이것은 올바른 예가 아니며 아무 말도하지 않는 컴파일러 제한 일뿐입니다. 개발자가 그렇게 결정한 것입니다.
두 가지 옵션이 있는 경우 하나에는 큰 정적 배열이 있고 다른 하나에는 작은 배열이 있으며 현재 프로그램이 실행 중일 때 한 가지 경우에는 예를 들어 함수를 재귀적으로 호출할 때 문제가 발생하고 다른 경우에는 문제가 발생합니다. 같은 조건에서 - 아니요. 그런 다음 갓 짜낸 주스의 위험에 대해 결론을 내릴 수 있습니다.)))
스택은 어떻습니까? 첫 번째 경우에는 컴파일 단계에서 정적으로 큰 메모리 블록을 힙에 할당하려고 시도했습니다. 이 블록에서 컴파일러로부터 이마를 받는 것이 당연했습니다. 너무 많은 메모리를 할당하거나 할당하지 않을 수 있습니다.
두 번째 경우에는 런타임에 이미 많은 메모리를 할당했습니다. 그리고 프로그램이 이미 특정 기계 리소스(메모리)로 작업하고 있기 때문에 할당이 가능한지 여부가 즉시 명확해집니다.
그리고 포인터는 무엇입니까? stat 동안 미리 정의된 두 가지 유형의 mql 배열. 컴파일 및 동적. * 포인터는 동적 배열뿐만 아니라 일반 클래스 필드도 가리킬 수 있습니다. 따라서 여기에서 포인터를 사용하는 것은 절대 정당화되지 않습니다.
추신 포인터, 클래스, 매크로와 같은 코드의 이상한 인상 - 무슨 일이 일어나고 있는지에 대한 완전한 이해 부족.
로컬 수준에서 선언하고 그렇게 끔찍하지 않은 숫자를 입력하여 예제를 약간 변경하면 컴파일러는 문제가 정확히 무엇인지에 대해 이미 일반 텍스트로 작성합니다.
#property strict #define ARRAY_SIZE int ( 140000 ) class Test { public : int nA; double fB; datetime dtC; Test( void ) : nA( 0 ) , fB( 1.0 ) , dtC( __DATETIME__ ) { }; }; void OnStart () { Test classTest[ARRAY_SIZE]; // the size of local variables is too large }갑자기 Renat에서 논쟁하고 싶다면 환영 합니다.
- 2014.02.08
- www.mql5.com
나는 이 수업을 하고 있다.
이제 객체 배열을 호출하고 싶습니다.
생성자에 전역 수준의 매개변수가 있는 경우 객체 배열을 빠르게 생성하는 방법은 무엇입니까?
예를 들어? 생성자를 변경하여 먼저 객체를 생성한 다음 OnInit에서 객체를 심볼로 대체하는 방법은 무엇입니까?
어쩌면 더 쉬운 해결책이 있습니까?