Yerel Değişkenler

Bir fonksiyon içinde bildirilen değişkenlere yerel değişken denir. Bunların etki alanları, içinde bildirildikleri fonksiyonun kapsamıyla sınırlıdır. Herhangi bir ifadenin sonucuyla başlatılabilirler. Her fonksiyon çağrısı bir yerel değişkeni başlatır. Yerel değişkenler karşılık gelen fonksiyonun bellek alanında muhafaza edilirler.

Örnek:

int somefunc()
  {
   int ret_code=0;
  ... 
   return(ret_code);
  }

Değişkenin kapsamı (etki alanı), içinde ifade edildiği programın bir bölümüdür. Bir blok içinde (içsel düzeyde) bildirilmiş değişkenler, kapsam olarak bu bloğun alanına sahiptirler. Blok kapsamı değişken bildirimiyle başlar ve son sağ küme parantezi ile biter.

Yerel değişken sıfatındaki fonksiyon parametreleri gibi, fonksiyon başında bildirilmiş yerel değişkenler de blok kapsamına sahiptir. Her blok bir veya daha çok değişken bildirimi içerebilir. Bloklar iç içe geçmişse ve dış bloktaki tanımlayıcı iç bloktakiyle aynı ismi taşıyorsa, iç bloğun işlemi bitene kadar dış bloğun tanımlayıcısı gizlenir.

Örnek:

void OnStart()
  {
//---
   int i=5;      // fonksiyonun yerel değişkenleri
     {
      int i=10;  // fonksiyon değişkeni
      Print("Blok içi i = ",i); // sonuç i=10;
     }
   Print("Blok dışı i = ",i);  // sonuç i=5;
  }

Yani, iç blok, çalışırken aynı isimli dış blok tanıtıcılarının değerlerini değil, sadece kendi yerel tanıtıcılarının değerlerini görecektir.

Örnek:

void OnStart()
  {
//---
   int i=5;      // fonksiyonun yerel değişkenleri
   for(int i=0;i<3;i++)
      Print("Blok içi i = ",i);
   Print("Blok dışı i = ",i);
  }
/* Uygulama sonuçları
 i = 0 için içeride
 i = 1 için içeride
i = 2 için içeride
Blok dışı i = 5
*/

static tanımlayıcısı ile bildirilen yerel değişkenler –programın başından beri mevcut olmalarına karşın– sadece mevcut bloğun kapsamına sahiptirler.

Yığın #

Her MQL5 programında, otomatik olarak oluşturulan yerel fonksiyon değişkenlerinin depolanması için yığın olarak adlandırılan özel bir bellek alanı tahsis edilir. Tüm fonksiyonlar için tek bir yığın tahsis edilir, bu yığının göstergeler için toplam boyutu 1Mb 'dır. Uzman Danışmanlarda ve betiklerde varsayılan yığın boyutu 8Mb 'dır ama yığın boyutu #property stacksize derleyici direktifi ile yeniden ayarlanabilir (bu direktif yığın boyutunu bayt cinsinden belirtir).

Statik yerel değişkenler, diğer statik ve global değişkenlerin saklandığı yerde saklanırlar (yığından ayrı olarak var olan özel bir bellek alanı içinde). Dinamik olarak oluşturulmuş değişkenler de yığından farklı bir bellek alanı kullanırlar.

Her fonksiyon çağrısıyla, statik olmayan içsel değişkenler için yığın üzerinde bir yer tahsis edilir. Fonksiyondan çıkılmasıyla birlikte bellek yeniden kullanım için uygun olacaktır.

Eğer ilk fonksiyon içinden ikincisi çağrılmışsa, ikinci fonksiyon kalan yığın alanından kendi değişkenleri için gereken alanı işgal edecektir. Yani, iç içe eklenmiş fonksiyonlar kullanılırken, yığın alanı sırasıyla her bir fonksiyon için işgal edilecektir. Bu, fonksiyonlardan birinin çağrısı sırasında hafıza sıkıntısına yol açabilir. Bu durum yığın aşımı olarak adlandırılır.

Yani, büyük yerel veriler için dinamik bellek kullanmanız daha iyi olabilir. Fonksiyon içinde yerel ihtiyaçlar için new veya ArrayResize() kullanarak gereken belleği tahsis edin. Fonksiyondan çıktığınızda delete veya ArrayFree() kullanarak belleği boşaltın.

Ayrıca Bakınız

Veri Tipleri, Tiplerin Kapsüllenmesi ve Genişletilebilirliği, Değişkenlerin Başlatılması, Değişkenlerin Görünürlük Alanları ve Ömürleri, Nesnelerin Oluşturulması ve Silinmesi