Emre Supçin – Kişisel Blog | C Dilinde Değişken Bildirim Yerleri (Ders 2)

Merhaba arkadaşlar,

Çoğu programda çıkış değerleri üretilmeden önce bir dizi hesaplamalar yapılır. Bu hesaplamalar esnasında verilerin geçici olarak saklanacağı alanların olması gerekir. C dilinde bu saklama alanlarına değişkenler denir. Veriler program içerisinde değişken ve sabit biçimlerinde kaydedilir. Değişkenler değerleri değiştirilebilen verilerdir. Sabitler ise değişkenlerin aksine atama yapıldıktan sonra değeri değiştirilemeyen verilerdir.

Formal Bildirim

Fonksiyonların argumanı olabilir; bunlara formal parametre denilir ve fonksiyonlara parametre/veri aktarımı için kullanılır. Formal parametrelerde uygun şekilde bildirilmelidir; bunlar da yerel değişkenler gibi yalnızca tanımlandığı fonksiyon içerisinde geçerlidirler. Formal parametre bildirimi hemen fonksiyon adının altında yapılabilir. Aşağıdaki program yapısının formal parametreleri m,n ve kr’dir ve fonk() yürütüldüğü sürece bellekte yer kaplarlar.

1.         fonk (m, n, kr)
2.         int m, n;
3.         char kr;
4.      { 
5.                 int a;
6.                 ...
7.                 fonksiyonun gövdesi;
8.                 ...
9.      }

m, n ve kr formal parametrelerdir. m ve n tamsayı, kr karakter türdendir. a ise fonksiyonun yerel değişkenidir. Formal parametreler fonksiyona değer aktarımı yapılacağı zaman kullanırlar. Formal bildirim aşağıdaki gibi de (yeni standart için geçerli) olabilir. Eğer aşağıdaki gibi yazılırsa, her değişkenin önüne türü ayrı ayrı yazılmalıdır!

1.       fonk(int m,int n,char kr)
2.    {
3.            int a;
4.            .
5.            .       fonksiyonun satırları;
6.            .
7.    }

Dışsal (Extern) Bildirim
Büyük programlar uygun olarak parçalara bölünüp, ayrı ayrı yazılıp derlendikten sonra birbirleriyle bağlantıları kurulabilir, birleştirilebilir. Bu, derleme süresini kısaltır. Çünkü tamamen doğru olarak yazılmış fonksiyon bir kez derlendikten sonra, programın tamamında kullanılırken tekrar derlenmez; yalnızca bağlantı kurulur, o anda üzerine değişiklik yapılan fonksiyonun bulunduğu dosya derlenir. Bir C programında birçok genel değişken olabilir. Program uygun parçalara bölünürken, kullanılacak olan genel değişkenler, bütün parçalarda aynı isimle bildirilirse derleyici hata verir. Ancak aynı genel değişkenlerin bütün parçalarda kullanılması gerekecektir.

Böyle durumlarda derleyicinin hata vermemesi için genel değişkenler, parçalanıp ayrı ayrı dosyalar biçiminde saklanmış programın, birinde normal olarak bildirirler; diğerlerinde dışsal bildirim yapılır. Dışsal bildirim extern anahtar sözcüğü kullanılarak yapılır.

Statik (Static) Değişken Bildirimi

Bilindiği gibi yerel değişkenler yalnızca bildirildiği fonksiyon içinde tanınırlar ve ait olduğu fonksiyon yürütüldüğü anda bellekte yer işgal ederler. Fonksiyon sonlandığında yerel değişkenlere atanan bellek gözleri, başka kullanımlar için tekrar boş bellek alanına eklenir. Bu nedenlerdir ki, fonksiyon tekrar yürütülmeye başladığında yerel değişkenlere bellekten yeni gözler verileceği için eski değerleri olmayacaktır. Fakat bazı uygulamalar var ki, yerel değişkenin tuttuğu değer kaybolmasın, eski değerini korusun istenir. Bu istek daha önce görülen yerel değişken bildirimiyle yapılamaz. Bunu yapabilmek için, yerel değişken bildirimi önüne static anahtar sözcüğü yazılmalıdır. Diğer bir deyişle statik değişken bildirimi yapılmalıdır. Örneğin;

1.    int ver()
2.              {
3.                 static ink k;
4.                 k=k+5;
5.                 return k;
6.              }

programında k, ver() adlı fonksiyonun statik yerel değişkenidir. Bu değişken için bellekte program sonlanana kadar sürekli yer ayrılır. Yani, statik yerel değişkenler genel değişkenler gibi programın yürütülmesi boyunca bellekte yer işgal ederler. Ancak genel değişkenler gibi diğer fonksiyonlarca tanınmazlar. Bu tür değişkenler, özellikle açılımlarla (matematikteki seri açılımları) ilgili veya kütüphaneye koymak amacıyla programcı tarafından yazılan fonksiyonların yazımında yararlıdır. Yukarıdaki fonksiyon her çağrılmasında bir önce gönderdiği değerin 5 fazlasını gönderir. Fakat ilk çağrıldığında göndereceği değer rastgele olacaktır; bazı derleyiciler de ise ilk çağrılmasında sıfır değeri verilir. Yani static türden değişkenlere de diğer değişken bildirimlerinde olduğu gibi sıfırdan farklı başlangıç değeri verilebilir. Böyle bir uygulama bir sonraki örnekte gösterilmiştir.

Statik değişkene iyi bir uygulama olarak, her çağrılışında Fibonacci serisinin bir sonraki elemanını veren fonksiyonun yazımı verilebilir. Fibonacci serisinin ilk iki elemanının değeri 1’dir; diğer elemanları kendisinden hemen önce gelen iki elemanın toplamına eşittir. Öyle bir fonksiyon yazalım ki, genel değişken kullanılmasın ve her çağrılışında Fibonacci serinin bir sonraki elemanını göndersin…

1.    int fibonacci()
2.              {
3.                   static int f1=1, f2=1;
4.                   int g;
5.       g=f1+f2;
6.       f1=f2;
7.       f2=g;
8.                   return g;
9.              }

Yukarıdaki fonksiyonda f1 ve f2 statik değişken olarak bildirilmiş olup başlangıç değeri olarak 1 sayısı verilmiştir. Fonksiyon ilk çağrıldığında serinin üçüncü elemanını verir. Eğer f1 ve f2 statik olarak bildirilmez ise fonksiyon her çağrılışında 2 sayısını gönderir. Statik değişkenlere başlangıç değeri verilirse, o değerler fonksiyon ilk çağrıldığında değişkene atanır; dha sonra kş çağırmalarda başlangıç değeri verilmemiş gibi değerlendirilir.

Saklayıcı Türden (Register) Değişken Bildirimi

Diğer bir değişken bildirimi, register anahtar sözcüğünü tamsayı ve karakter değişken bildirimlerinin önüne koyarak yapılır. Bu bildirime saklayıcı türden değişken bildirimi denir. bu tür değişkenler için bellek gözü kullanılmaz; doğrudan işlemcinin genel amaçlı saklayıcıları kullanılır. Bir değişken bellekte değil de işlemcinin saklayıcısında tutuluyorsa, o değişkene erişim daha hızlı olur. Çünkü bellekte tutulan değişkenlere erişmek, en azından bellekten bir okuma ve belleğe bir yazma işlemi yapmayı gerektirir. Eğer değişken saklayıcı türden bildirilmişse bu işlemler gerekmez. Genelde döngü sayaçları gibi çok kullanılan değişkenler saklayıcı türden bildirilirler.

1.   fonk(a,k)
2.                register int a;
3.                register char k;
4.         {
5.                register int m,n;
6.                .
7.                .
8.         }

Verilen programda a ve k formal parametrelerdir ve saklayıcı türden bildirilmiştir. Saklayıcı türden diğer değişkenler fonksiyonun yerel değişkenleri olan m ve n’dir. Görüldüğü gibi dört tane saklayıcı türden değişken bildirilmiştir. En fazla kaç tane bildirileceği işlemciye ve kullanılan derleyiciye bağlıdır. 16 bitlik işlemcilerde genelde en fazla iki tane kullanılabilir; iki taneden fazla önemsenmez, saklayıcı türden olmadığı varsayılır. Saklayıcı türden değişkenlerin önüne & işaretçi operatörü koyularak kullanılmamalıdır; işlemci saklayıcısının adresi olmaz, bellek gözlerinin adresi vardır. Dolayısıyla, yalnızca bellekte saklanan değişkenlerin önüne & işaretçi operatörü koyularak kullanılabilir.

volatile Türden Değişken Bildirimi

C derleyicileri bir programı derlerken (istenirse) bellek kullanımı ve hız açısından optimizasyon yapabilirler. Ancak bazı değişkenlerin optimizasyon işlemine sokulması istenmeyen umulmadık hatalara neden olabilir. Özellikle, o anda yürütülen program metni içindeki herhangi bir değişkenin içeriği, kesme hizmet programı (interrupt service routine) veya herhangi bir çevre birimi tarafından değiştiriliyorsa istenmeyen hatalar oluşabilir. Program, genel olarak optimizasyon işlemine sokulurken bazı değişkenlerin optimizasyon işlemine sokulmaması için, ilgili değişken önüne bildirimi yapılırken tür adının önüne volatile anahtar sözcüğü yazılır.

Yazar
Yazar
Bilgisayar Programcısı, Web Tasarımcı, Üniversite Öğrencisi...
Twitter Facebook Google Linkedin Flickr YouTube

Önceki Yazı:C Dilinde Değişken Bildirim Yerleri (Ders 1)

Sonraki Yazı:Outlook Express’te Yedek Alma İşlemi?

YORUMLAR
SİZ DE CEVAP YAZABİLİRSİNİZ
Bu yazı hakkında görüşünüzü belirtin.

ES Web Tasarım Web Tasarım Blog Teması Emre Supçin Bu tema ES Web Tasarım tarafından düzenlenmiştir. Hiçbir şekilde kopyalanamaz.