Fonksiyonları değer ile çağırma (call by value) tekniğinde prensip, çağıran program ya da fonksiyondaki argümanlarla çağrılan fonksiyonda bunlara karşı gelen parametrelere, bellekte farklı yerlerin ayrılmasıdır.
Aşağıdaki programda, çağıran program - main; topla_1 adlı fonksiyona x, y ve z argüman değerlerini göndermektedir. Bu argüman değerleri sırası ile topla_1 fonksiyonundaki a, b, c parametreleri içine aktarılacaktır. Sonuçta topla_1 fonksiyonu gönderilen 3 argümanın toplamını hesaplayarak sonucu çağıran programa gönderir.
KOD BLOĞU:
int topla_1(int a,int b,int c);
#import <Foundation/Foundation.h>
int main(int argc,const char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int x,y,z,t;
x=1;
y=2;
z=3;
t=topla_1(x,y,z);
NSLog(@"\TOPLAM=%i\n",t);
NSLog(@"\nx=%i",x);
NSLog(@"\ny=%i",y);
NSLog(@"\nz=%i\n\n",z);
[pool drain];
return 0;
}
int topla_1(int a,int b,int c)
{
NSLog(@"\na=%i",a);
NSLog(@"\nb=%i",b);
NSLog(@"\nc=%i\n\n",c);
return a+b+c;
}
Çağıran program ve çağrılan fonksiyonla ilgili veri aktarımı ve paylaşımı şöyledir:
PROGRAMIN ÇIKTISI:
a=1
b=2
c=3
TOPLAM=6
x=1
y=2
z=3
Değer İle Çağırmada Fonksiyon İçinde Parametre Değerlerinin Değiştirilmesi:
Çağıran fonksiyon ya da programdan çağrılan fonksiyona değer ile veri aktarımında, çağrılan fonksiyon içinde parametre değerlerinde gerçekleştirilecek olan değişiklik, çağıran programda bu parametrelere karşı gelen argüman değerlerinde bir değişikliğe yol açmaz. Aşağıdaki örnek program bize bu konuda bir fikir verecektir.
KOD BLOĞU:
int topla_1(int a,int b,int c);
#import <Foundation/Foundation.h>
int main(int argc,const char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int x,y,z,t;
x=1;
y=2;
z=3;
t=topla_1(x,y,z);
NSLog(@"\TOPLAM=%i\n",t);
NSLog(@"\nx=%i",x);
NSLog(@"\ny=%i",y);
NSLog(@"\nz=%i\n\n",z);
[pool drain];
return 0;
}
int topla_1(int a,int b,int c)
{
a=a-1;
b=b-1;
c=c-2;
NSLog(@"\na=%i",a);
NSLog(@"\nb=%i",b);
NSLog(@"\nc=%i\n\n",c);
return a+b+c;
}
PROGRAMIN ÇIKTISI:
a=0
b=1
c=1
TOPLAM=2
x=1
y=2
z=3
AÇIKLAMA:
Çağıran program; x, y ve z argümanları ile sırasıyla 1, 2 ve 3 değerlerini çağrılan topla_1 fonksiyonuna göndermekte ve bunlar ilk anda aşağıdaki tabloda belirtilen durumu oluşturmaktadır:
Daha sonra fonksiyon içinde,
a=a-1;
b=b-1;
c=c-2;
Atama döngüleri ile a, b ve c parametreleri değiştirilmektedir. Bunun sonucunda bellekteki son durum aşağıdaki gibi olur:
Bunun sonucu olarak,
return a+b+c;
komutuyla çağıran programa 2 değeri gönderilerek
TOPLAM=2
ifadesi elde edilir. Bu tip bir programda isteğimiz 1+2+3 değerini hesaplatmaksa, elbette o sonucu elde edemeyiz. Bu nedenle, çağrılan fonksiyon içinde parametre değerlerinin değiştirilmesi söz konusu olunca çok dikkatli olmamız gerekir.