Parametrelerin Geçirilmesi

Makine dilinin argümanları bir alt programa (fonksiyona) geçirmesinin iki yolu vardır. İlk yol değer aracılığıyla aktarmaktır. Argüman değeri bir biçimsel fonksiyon parametresinin içine kopyalanır. Fonksiyon içinde bu parametrede yapılan değişikliklerin hiçbirinin, ilgili çağrı argümanı üzerinde bir etkisi yoktur.

//+------------------------------------------------------------------+
//| Parametrelerin değer ile geçirilmesi                             |
//+------------------------------------------------------------------+
double FirstMethod(int i,int j)
  {
   double res;
//---
   i*=2;
   j/=2;
   res=i+j;
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int a=14,b=8;
   Print("çağrı öncesi a ve b:",a," ",b);
   double d=FirstMethod(a,b);
   Print("çağrı sonrası a ve b:",a," ",b);
  }
//--- Betiğin çalışma sonucu
//  çağrı öncesi a ve b: 14 8
//  çağrı sonrası a ve b: 14 8

İkinci yöntem referans ile geçirmedir. Bu durumda, fonksiyon parametresine bir değer değil, bir değişken referansı geçirilir. Bu, çağrıda belirtilen gerçek parametreyi ifade etmek için kullanılır. Yani, fonksiyonun çağrılmasında kullanılan argümanlar parametre değişimlerinden etkilenecektir.

//+------------------------------------------------------------------+
//| Parametrelerin referansla geçirilmesi                            |
//+------------------------------------------------------------------+
double SecondMethod(int &i,int &j)
  {
   double res;
//---
   i*=2;
   j/=2;
   res=i+j;
//---
   return(res);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int a=14,b=8;
   Print("çağrı öncesi a ve b:",a," ",b);
   double d=SecondMethod(a,b);
   Print("çağrı sonrası a ve b:",a," ",b);
  }
//+------------------------------------------------------------------+
//--- script çalışmasının sonucu
//  çağrı öncesi a ve b: 14 8
//  çağrı sonrası a ve b: 28 4

Yukarıda açıklanan yolların ikisi de MQL5 içinde kullanılır, bir istisna dışında: diziler, yapı tipli değişkenler ve sınıf nesneleri her zaman referans ile geçirilirler. Gerçek parametrelerdeki (fonksiyon çağrılarında geçirilen argümanlar) değişikliklerden kaçınmak amacıyla, const erişim belirtecini kullanabilirsiniz. const belirteci ile bildirilmiş değişkenlerin içeriğinde değişiklik yapılması denendiğinde, derleyici bir hata oluşturacaktır.

Not

Bilinmelidir ki parametreler fonksiyona ters sırada geçirilirler. Yani, ilk olarak son parametre hesaplanır ve geçirilir, ardından sondan bir önceki vb. Son olarak hesaplanıp geçirilen parametre ise, açılan parantezin yanında ilk sırada durandır.

Örnek:

void OnStart()
  {
//---
   int a[]={0,1,2};
   int i=0;
 
   func(a[i],a[i++],"İlk çağrı (i = "+string(i)+")");
   func(a[i++],a[i],"İkinci çağrı (i = "+string(i)+")");
// Sonuç:
// İlk çağrı (i = 0) : par1 = 1     par2 = 0
// İkinci çağrı (i = 1) : par1 = 1     par2 = 1
 
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void func(int par1,int par2,string comment)
  {
   Print(comment,": par1 = ",par1,"    par2 = ",par2);
  }

İlk çağrıda (yukarıdaki örneğe bakın) i değişkeni ilk olarak dizgilerin birleştirilmesinde kullanılır:

  "İlk çağrı (i = "+string(i)+")"

Burada 'i' değeri değişmemektedir. Ardından i değişkeni a[i++] dizi elemanının hesabında kullanılır. Yani i indisli elemana ulaşıldığında, i değeri artırılır. Değiştirilmiş i değerine sahip ilk parametre, ancak bundan sonra hesaplanacaktır.

İkinci çağrıda i'nin aynı değeri (fonksiyon çağrısının ilk aşamasında hesaplanan) tüm parametrelerin hesaplanmasında kullanılır. i değişkeni sadece ilk parametreler hesaplandıktan sonra yeniden değişir.

Ayrıca Bakınız

Değişkenlerin Görünürlük Alanları ve Ömürleri, Aşırı Yükleme, Sanal Fonksiyonlar, Polimorfizm