Şahsen, bu gibi durumlarda nesnelerin başlatma işlevini kullanıyorum.
Önce bir dizi oluşturulur ve ardından tüm parametrelerin ayarlanabildiği dizideki tüm nesneler için Init() işlevi çağrılır.
Ayrı bir işlevle başlatma, nesnelerin yeniden başlatılmasına izin verir ve bir kurucuda başlatılırsa, nesne yeniden başlatılamaz.
Şahsen, bu gibi durumlarda nesnelerin başlatma işlevini kullanıyorum.
Önce bir dizi oluşturulur ve ardından tüm parametrelerin ayarlanabileceği tüm dizi nesneleri için Init() işlevi çağrılır.
Ayrı bir işlevle başlatma, nesnelerin yeniden başlatılmasına izin verir ve bir kurucuda başlatılırsa, nesne yeniden başlatılamaz.
Ben de öyle tahmin etmiştim. Teşekkür ederim !
Ve bir an. Bir işaretçi aracılığıyla nesne dizileri oluşturmak daha iyidir. Aksi takdirde, yığın belleğinde çok küçük bir dizi elde edersiniz:
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 ; } }
Bu bir sorun değil, çok daha az potansiyel bir sorun. Sadece MT'de bellekle çalışmanın özellikleri. İşte statik dizi:
#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 () { }
Ve işte dinamik dizi:
#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]; }
Bu durumda, her şey derlenir ve çalışır.
Bu bir sorun değil, çok daha az potansiyel bir sorun. Sadece MT'de bellekle çalışmanın özellikleri. İşte statik dizi:
Ve işte dinamik dizi:
Bu durumda, her şey derlenir ve çalışır.
Ve yığının nesi var? İlk durumda, statik olarak (derleme aşamasında) yığında büyük bir bellek bloğu ayırmaya çalıştınız, bu da derleyiciden hak ettiğiniz bir alnını aldınız, çünkü gerçek hayatta olup olmayacağı hiç belli olmayacak. çok fazla bellek ayırmak mümkün olabilir veya olmayabilir.
İkinci durumda, çalışma zamanında zaten büyük bir bellek parçası tahsis etmiş olursunuz. Ve burada, program zaten belirli bir makine kaynağı (bellek) ile çalıştığından, tahsis etmenin mümkün olup olmayacağı hemen açıktır.
Ve işaretçiler ne durumda? stat sırasında önceden tanımlanmış iki türden mql cinsinden diziler. derleme ve dinamik. Yalnızca * işaretçileri dinamik dizilere değil, aynı zamanda sıradan sınıf alanlarına da işaret edebilir. Bu nedenle, burada işaretçilerin kullanılması kesinlikle haklı değildir.
ps işaretçiler, sınıflar, makrolar gibi koddan garip bir izlenim - neler olup bittiğine dair tam bir anlayış eksikliği.
Bu bir sorun değil, çok daha az potansiyel bir sorun. Sadece MT'de bellekle çalışmanın özellikleri. İşte statik dizi:
Ve işte dinamik dizi:
Bu durumda, her şey derlenir ve çalışır.
Bu doğru örnek değil, sadece hiçbir şey söylemeyen bir derleyici sınırlaması, sadece geliştiriciler öyle karar verdi.
İki seçenek varsa - birinde büyük bir statik dizi, diğerinde küçük bir dizi ve şimdi, program çalışırken, bir durumda, örneğin bir işlevi özyinelemeli olarak çağırırken ve diğerinde sorunlar ortaya çıkar. aynı koşullar altında - hayır. O zaman taze sıkılmış meyve suyunun tehlikeleri hakkında bir sonuç çıkarmak mümkün olacaktır)))
Ve yığının nesi var? İlk durumda, statik olarak (derleme aşamasında) yığında büyük bir bellek bloğu ayırmaya çalıştınız, bu da derleyiciden hak ettiğiniz bir alnını aldınız, çünkü gerçek hayatta olup olmayacağı hiç belli olmayacak. çok fazla bellek ayırmak mümkün olabilir veya olmayabilir.
İkinci durumda, çalışma zamanında zaten büyük bir bellek parçası tahsis etmiş olursunuz. Ve burada, program zaten belirli bir makine kaynağı (bellek) ile çalıştığından, tahsis etmenin mümkün olup olmayacağı hemen açıktır.
Ve işaretçiler ne durumda? stat sırasında önceden tanımlanmış iki türden mql cinsinden diziler. derleme ve dinamik. Yalnızca * işaretçileri dinamik dizilere değil, aynı zamanda sıradan sınıf alanlarına da işaret edebilir. Bu nedenle, burada işaretçilerin kullanılması kesinlikle haklı değildir.
ps işaretçiler, sınıflar, makrolar gibi koddan garip bir izlenim - neler olup bittiğine dair tam bir anlayış eksikliği.
Yerel düzeyde bir bildirimde bulunarak ve o kadar da korkunç olmayan bir sayı koyarak örneği biraz değiştirirseniz, derleyici sorunun tam olarak ne olduğunu zaten düz metin olarak yazar:
#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'ta aniden tartışmak istersen, hoşgeldin .
- 2014.02.08
- www.mql5.com
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
ben bu sınıfı yapıyorum
Şimdi bir dizi nesneyi çağırmak istiyorum:
Yapıcı global düzeyde parametrelere sahipse, hızlı bir şekilde bir dizi nesne nasıl oluşturulur?
Örneğin? önce yapıcıyı değiştirerek nesneler oluşturun ve ardından OnInit'teki nesneleri sembollerle olacak şekilde nasıl değiştirebilirim?
Belki daha kolay bir çözüm vardır?