C dilinde, { } sembolleri arasına alınmış bir program parçasına blok (ing. Block) adını veriyoruz.
Bir değişkenin içinde tanımlanmış olduğu en küçük blok, bu değişkeni içeren blok olarak isimlendirilir.
ÖRNEK:
#import <Foundation/Foundation.h>
int main(int argc,char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int x=6,y=4;
{
int z;
z=x+y;
NSLog(@"\nz=%i",z);
}
[pool drain];
return 0;
}
Bu programda, x ve y değişkenlerini içeren blok main fonksiyonudur; yani main içinde her noktada tanımlı ve erişilebilir değişkenlerdir. Bu anlamda bu değişkenler, sadece z’nin tanımlandığı iç blokta da geçerlidirler. Öneğin, iç blok içindeki z=x+y; döngüsü ile z’nin değeri 10 olarak hesaplanır ve printf deyimi ile de yazdırılır. Yukarıdaki programda, main içinde açılan ikinci blok ya da iç blok içinde tanımlanmış olan z değişkeni, tanımlandığı iç blok dışında geçersiz bir değişkendir. Örneğin, z’nin değeri, aşağıdaki programda olduğu gibi, bu iç blok dışında yazdırılmak istenirse:
error C2065: 'z' : undeclared identifier şeklinde, z’nin tanımlanmamış bir değişken olduğunu belirten bir mesaj alınacaktır.
auto BELLEK SINIFI
Herhangi bir C fonksiyonunun içinde,
int a,b;
float x,y;
gibi bildirimleri gerçekleştirdiğimiz zaman gerçekte a, b, x ve y değişkenlerini auto bellek sınıfında tanımlamış oluruz. auto bellek sınıfı, C için default (önceden belirlenmiş) sınıftır. Yukarıdaki tanımlar yerine,
auto int a,b;
auto float x,y;
bildirimlerini kullanmak da olasıdır, ancak yukarıdaki ilk biçim tercih edilir.
Gerçekte, herhangi bir bellek sınıfı için, bildirimde bulunulacaksa önce sınıf bildirim sözcüğü ve sonra tip bildirim sözcüğü kullanılır.
Derleyici, auto sınıfında tanımlanmış bir değişken için, değişkenin tanımlanmış olduğu “içeren blok” içine girince otomatik olarak bellekte yer ayırır (auto sözcüğü bununla ilişkilidir) ve programın kontrolü bu içeren bloğun dışına çıkınca da değişken tanımsız hale gelir.
auto sınıfında tanımlanmış bir değişken sadece tanımlanmış olduğu “içeren blok” içinde geçerlidir. (Yukarıdaki, “BLOK KAVRAMI” bölümündeki z değişkeni gibi.).auto sınıfında bir değişken blok içinde bildirilmiş fakat kendisine ilk değer atanmamışsa, kendisine bir değer atanana kadar değeri tanımsız olarak kalacaktır.
auto sınıfındaki değişkenler, sadece tanımlanmış oldukları blok içinde geçerli oldukları ve bloktan çıkıldığında saklanmadıkları için bazı uygulamalarda yetersiz kalırlar. Aşağıdaki örneği inceleyiniz:
ÖRNEK:
Bir fonksiyonun çağrılma sayısını bulmak.
Aşağıdaki Objective C programında, main içinden, topla adlı bir fonksiyon çağrılarak, main içine girilen iki tam sayının toplamının hesaplatılması isteniyor. Programcı ayrıca topla adlı fonksiyonun programın çalışması sırasında kaç kez çağrıldığını da tespit etmek istiyor. Bu amaçla topla fonksiyonu içine say adlı sayaç görevi yapacak olan değişken aşağıdaki gibi yerleştirilirse sonuçta istenen elde edilemeyecek ve elde edilen şey başarısızlık olacaktır:
#include "stdlib.h"
#import <Foundation/Foundation.h>
int main(int argc,char *argv[])
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
int x,y,r;
int topla(int a,int b);
while(1)
{
NSLog(@"\nBIR TAM SAYI GIRINIZ.(DURDURMAK ICIN NEGATIF).");
scanf("%i",&x);
NSLog(@"\nBIR TAM SAYI GIRINIZ.(DURDURMAK ICIN NEGATIF).");
scanf("%i",&y);
if(x<0 || y<0) exit(0);
r=topla(x,y);
NSLog(@"\nTOPLAM=%i\n\n",r);
}
[pool drain];
return 0;
}
int topla(int a,int b)
{
int say=0;
say++;
NSLog(@"\nCAGRI SAYISI=%i\n\n",say);
return a+b;
}
PROGRAMIN ÇIKTISI:
Bu başarısızlığın sebebi, say adlı değişkenin auto sınıfında bir değişken olmasındadndır. Bu yüzden, topla adlı fonksiyona her girildiğinde say adlı değişken yeniden tanımlanacak ve 0 ilk değerini alacak ve bu nedenle çağrı sayısı hep 1 olarak görünecektir.
Bu problemin çözümü, say adlı değişkeni static bellek sınıfında tanımlamakla elde edilebilir. Yukarıdaki topla fonksiyonu aşağıdaki biçime getirilirse:
int topla(int a,int b)
{
static int say=0;
say++;
NSLog(@"\nCAGRI SAYISI=%d\n\n",say);
return a+b;
}
aşağıdaki çıktıda görüleceği gibi fonksiyon için çağrı sayıları doğru olarak bulunacak ve beklenen sonuç elde edilecektir.
Bir sonraki bölümde static bellek sınıfı konusunda ayrıntılı bilgi verilecektir.