ArrayResize

Dizinin ilk boyutunun eleman sayısını değiştirir

int  ArrayResize(
   void&  array[],              // referansla geçirilen dizi
   int    new_size,             // yeni eleman sayısı
   int    reserve_size=0        // rezerve büyüklük değeri (ilave)
   );

Parametreler

array[]

[out] Büyüklüğü değiştirilecek dizi.

new_size

[in]  İlk boyut için belirlenen yeni büyüklük.

reserve_size=0

[in]  Olası ilaveler için ayrılan büyüklük.

Dönüş değeri

Başarılı çalıştırma durumunda büyüklüğü ayarlanmış dizinin eleman sayısına dönüş yapar. Aksi durumda -1 değerine dönüş yapar ve dizi büyüklüğü değiştirilmez.

ArrayResize() fonksiyonu bir statik diziye, bir zaman serisine veya bir gösterge tamponuna uygulandığında büyüklük değerleri değişmez (bu tip diziler için yeni bellek tahsis edilmez). Bu durumda yeni_boyut<=ArraySize(dizi) işlemi yeni_boyut değerine; aksi durumda -1 değerine dönüş yapar.

Not

Bu fonksiyon sadece dinamik diziler üzerinde uygulanabilir. SetIndexBuffer() fonksiyonu aracılığıyla gösterge tamponu olarak atanmış dizilerin büyüklükleri değiştirilemez. Gösterge tamponları için tüm yeniden boyutlandırma işlemleri, terminalin çalışma zamanı alt sistemi tarafından gerçekleştirilir.

Dizideki elemanların sayısı 2147483647'yi geçemez.

Bellek tahsisi sık yapılıyorsa, fiziksel bellek tahsisinin sayısını azaltmak için, rezervi ayarlayan üçüncü parametrenin kullanımı tavsiye edilir. ArrayResize'ın daha sonraki çağrılarının tamamı, belleğin fiziksel olarak yeniden tahsisine yol açmaz. Sadece ilk boyutun büyüklüğünü ayrılmış bellek içerisinde değiştirir. Üçüncü parametrenin sadece fiziksel bellek tahsisi sırasında kullanılacağı hatırlanmalıdır. Örnek olarak:

ArrayResize(arr,1000,1000);
for(int i=1;i<3000;i++)
   ArrayResize(arr,i,1000);

Bu durumda belleğin yeniden tahsisi iki kere gerçekleşir. İlki, 3000 elemanlı döngüye girilmeden (dizi büyüklüğü 1000 olarak ayarlanacak); ikincisi ise i, 2000'e eşit olduğunda gerçekleşecektir. Üçüncü parametreyi atladığımız takdirde, belleğin 2000 defa yeniden tahsisi söz konusu olacaktır, bu da programı yavaşlatacaktır.

Örnek:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- Sayaçlar
   ulong start=GetTickCount();
   ulong now;
   int   count=0;
//--- Hızlı bir versiyonun gösterimi için bir dizi oluştur
   double arr[];
   ArrayResize(arr,100000,100000);
//--- Bellek ayrılan versiyonun ne kadar hızlı çalıştığını kontrol et
   Print("--- Test Fast: ArrayResize(arr,100000,100000)");
   for(int i=1;i<=300000;i++)
     {
      //--- 100,000 elemanlı rezerve belirleyerek yeni dizi büyüklüğü ayarla!
      ArrayResize(arr,i,100000);
      //--- Yuvarlak bir sayıya ulaştığında , dizi büyüklüğünü ve harcanan zamanı göster
      if(ArraySize(arr)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(arr)=%d Time=%d ms",count,ArraySize(arr),(now-start));
         start=now; 
        }
     }
//--- Şimdi, rezerve bellek tahsisi olmayan versiyonun ne kadar yavaş çalıştığını göster
   double slow[];
   ArrayResize(slow,100000,100000);
//--- 
   count=0;
   start=GetTickCount();
   Print("---- Test Slow: ArrayResize(slow,100000)");
//---
   for(int i=1;i<=300000;i++)
     {
      //--- Ek rezerv olmadan yeni bir dizi büyüklüğü belirle
      ArrayResize(slow,i);
      //--- Yuvarlak bir sayıya ulaştığında , dizi büyüklüğünü ve harcanan zamanı göster
      if(ArraySize(slow)%100000==0)
        {
         now=GetTickCount();
         count++;
         PrintFormat("%d. ArraySize(slow)=%d Time=%d ms",count,ArraySize(slow),(now-start));
         start=now;
        }
     }
  }
//--- Betiğin sonucu
/*
   Test_ArrayResize (EURUSD,H1)   --- Test Fast: ArrayResize(arr,100000,100000)
   Test_ArrayResize (EURUSD,H1)   1. ArraySize(arr)=100000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   2. ArraySize(arr)=200000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   3. ArraySize(arr)=300000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   ---- Test Slow: ArrayResize(slow,100000)
   Test_ArrayResize (EURUSD,H1)   1. ArraySize(slow)=100000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   2. ArraySize(slow)=200000 Time=0 ms
   Test_ArrayResize (EURUSD,H1)   3. ArraySize(slow)=300000 Time=228511 ms
*/

Ayrıca Bakınız

ArrayInitialize