Optimizasyon sırasında tek seferlik dizi hesaplaması - sayfa 6

 
Alexey Viktorov :

İşte bir dizi yazma ve okuma örneği

Hata ayıklama modunda iki kez çalıştırın ve diziyi yazmanın ve okumanın ne kadar sürdüğünü görün. İlk çalıştırma diziyi bir dosyaya yazar ve ikinci çalıştırma onu okur ve diziden tarihleri yazdırmaya başlar. Ardından seçilen parça ile ilgilenin, IS_DEBUG_MODE'u kaldırmanız ve duruma IsOptimization () eklemenin gerekli olup olmadığı ile ilgilenin

Teşekkür ederim!
 
Dmitry Fedoseev :

FileWriteInteger() gibi işlevler vardır. Yere göre tanımlayın, değişken dosyanın başında olmalıdır, okuduktan sonra işaretçi sonuna hareket eder, yani. dizinin başına, diziyi okuduktan sonra, işaretçi bir sonraki değişkenin önünde olacaktır...

Dosyalarla çalışma hakkında yakında makale geliyor.

Dosya işlemleri ile ilgili bir yazı olmadığını size yazmak istedim. Bilgilendirici ve anlaşılır kılıyorsunuz, çıktıklarında mutlaka okuyacağım.

 

Küresel düzeyde bir dizi bildirmeye çalıştı (mql4 kodu)

 datetime T[];

init ile doldurun

 ArrayResize (T, 40 );
datetime T[ 40 ]=
   {
   1262731020 , 1262735700 , 1262821920 , 1262903400 , 1262989740 , 1263247200 , 1263339060 , 1263420000 , 1263507480 , 1263595500 ,
   1265324700 , 1265407200 , 1265752980 , 1265926500 , 1265930820 , 1267657200 , 1267740300 , 1267826460 , 1268175840 , 1268346360 ,
   1270504920 , 1270684140 , 1270768500 , 1272924180 , 1273011720 , 1273097100 , 1273272240 , 1273528800 , 1273617180 , 1275344100 ,
   1275516000 , 1275602400 , 1275689160 , 1276034400 , 1276124580 , 1276208700 , 1276211640 , 1278027960 , 1278369780 , 1278373920
   };

başlangıçta yazdırırken, 1971 tarihini gösteriyor, yani dizi boş

 for ( int x= 0 ;x<= 39 ;x++)
   {
   Print ( "T[x]=" ,T[x], "x=" ,x);   
   }

Başlangıçta diziyi doldurursanız değerler ortaya çıkıyor. Belki de bunun nedeni diziyi yeni bir tarih saatinde başlatmamdır, ancak kod onsuz derlenmiyor mu?

Genel olarak, dizi kaybolur. Neyi yanlış yapıyorum?

 
forexman77 :

Küresel düzeyde bir dizi bildirmeye çalıştı (mql4 kodu)

init ile doldurun

başlangıçta yazdırırken, 1971 tarihini gösteriyor, yani dizi boş

Başlangıçta diziyi doldurursanız değerler ortaya çıkıyor. Belki de bunun nedeni diziyi yeni bir tarih saatinde başlatmamdır, ancak kod onsuz derlenmiyor mu?

Genel olarak, dizi kaybolur. Neyi yanlış yapıyorum?

derleyici tarafından vurgulanan uyarıya bakın.

 ArrayResize (T, 40 );
datetime T[ 40 ]=

böyle hafif bir hareketle, OnInit'ten çıktıktan sonra güle güle..

 
Maxim Kuznetsov :

derleyici tarafından vurgulanan uyarıya bakın.

böyle hafif bir hareketle, OnInit'ten çıktıktan sonra güle güle..

Küresel düzeyde zaten var olduğunu yazıyor)

'T' beyanı, 40. satırdaki küresel beyanı gizler

Ama nasıl doğru yapılır. Daha önce, küme parantezleri bir dizi bildirmiyordu . Sıfırla başlatıldı ve boyutu ayarlayın ve ardından bir döngü ile doldurun. Burada yapılması gereken başka bir şey var mı?

İnternetten tarih saatini kaldırırsam derlenmez, iki hata yazar:

'{' - İfade bekleniyor

'=' - yasadışı işlem kullanımı



 
forexman77 :

Küresel düzeyde zaten var olduğunu yazıyor)

'T' beyanı, 40. satırdaki küresel beyanı gizler

Ama nasıl doğru yapılır. Daha önce, küme parantezleri bir dizi bildirmiyordu . Sıfırla başlatıldı ve boyutu ayarlayın ve ardından bir döngü ile doldurun. Burada yapılması gereken başka bir şey var mı?

İnternetten tarih saatini kaldırırsam derlenmez, iki hata yazar:

'{' - İfade bekleniyor

'=' - yasadışı işlem kullanımı



sabit bir başlatma ile birlikte bir dizi bildirimi küresel düzeyde yapılabilirdi (ve yapılmalıydı).

 datetime T[ 40 ]=
   {
   1262731020 , 1262735700 , 1262821920 , 1262903400 , 1262989740 , 1263247200 , 1263339060 , 1263420000 , 1263507480 , 1263595500 ,
   1265324700 , 1265407200 , 1265752980 , 1265926500 , 1265930820 , 1267657200 , 1267740300 , 1267826460 , 1268175840 , 1268346360 ,
   1270504920 , 1270684140 , 1270768500 , 1272924180 , 1273011720 , 1273097100 , 1273272240 , 1273528800 , 1273617180 , 1275344100 ,
   1275516000 , 1275602400 , 1275689160 , 1276034400 , 1276124580 , 1276208700 , 1276211640 , 1278027960 , 1278369780 , 1278373920
   };
void OnInit() 
{
 ....
}
 
forexman77 :

Küresel düzeyde zaten var olduğunu yazıyor)

'T' beyanı, 40. satırdaki küresel beyanı gizler

Ama nasıl doğru yapılır. Daha önce, küme parantezleri bir dizi bildirmiyordu . Sıfırla başlatıldı ve boyutu ayarlayın ve ardından bir döngü ile doldurun. Burada yapılması gereken başka bir şey var mı?

İnternetten tarih saatini kaldırırsam derlenmez, iki hata yazar:

'{' - İfade bekleniyor

'=' - yasadışı işlem kullanımı



aracılığıyla = diziler yalnızca bildirildiğinde başlatılabilir. Bir şekilde C'nin bir kalıntısı, ama burada kabul ediliyor :-)
 
Maxim Kuznetsov :

sabit bir başlatma ile birlikte bir dizi bildirimi küresel düzeyde yapılabilirdi (ve yapılmalıydı).

Evet denedim ve işe yarıyor. Ve küresel bir seviye olmadan, herhangi bir şekilde, diziyi internette bir kez doldurmak ve ardından dizinin değerlerini kullanmak için hesaplama maliyetlerini azaltmak için mi?

Global düzeyde mantıksal olarak değişkenler her zaman değişmese de, bu, hesaplamanın programın başında bir kez yapıldığı anlamına mı geliyor?

 
forexman77 :

Evet denedim çalışıyor. Ve küresel bir seviye olmadan, herhangi bir şekilde, diziyi internette bir kez doldurmak ve ardından dizinin değerlerini kullanmak için hesaplama maliyetlerini azaltmak için mi?

Global düzeyde mantıksal olarak değişkenler her zaman değişmese de, bu, hesaplamanın programın başında bir kez yapıldığı anlamına mı geliyor?

evet, ex4 ex5 ikili dosyasını terminal tarafından yürütülmek üzere hazırlarken. Tanımlanan (ve derleme sırasında ex4 / 5 içinde saklanan) veri dizisine sadece bağlantıların atıldığını ve bunun çok hızlı olduğunu düşünebilirsiniz..
 
forexman77 :

Küresel düzeyde zaten var olduğunu yazıyor)

'T' beyanı, 40. satırdaki küresel beyanı gizler

Ama nasıl doğru yapılır. Daha önce, küme parantezleri bir dizi bildirmiyordu . Sıfırla başlatıldı ve boyutu ayarlayın ve ardından bir döngü ile doldurun. Burada yapılması gereken başka bir şey var mı?

İnternetten tarih saatini kaldırırsam derlenmez, iki hata yazar:

'{' - İfade bekleniyor

'=' - yasadışı işlem kullanımı



Evet, dizinin nasıl doldurulduğu önemli değil. Sadece bir koşul belirlemeniz gerekir, eğer dizi boyutu sıfır ise, o zaman hesaplanmalı, doldurulmalı ve bir dosyaya yazılmalıdır. Ve OnInit() içinde, örneğimi izleyerek, bildirilen diziyi okumaya çalışın. Buna göre dizi dosyası varsa okunur, dizi doldurulur, dizi yeniden hesaplanıp doldurulmaz.