C Dilinde Değişken Bildirim Yerleri (Ders 2)

C Dilinde Değişken Bildirim Yerleri (Ders 2) Merhaba arkadaşlar, Çoğu programda çıkış değerleri üretilmeden evvela bir sıra hesaplamalar yapılır. Bu hesaplamalar sırasında verilerin geçici şekilde saklanacağı sahaların olması gerekir. C dilinde bu gizleme sahalarına değişkenler denir. Veriler program arasında değişken ve sabit biçimlerinde kaydedilir. Değişkenler değerleri değiştirilebilen verilerdir. Sabitler ise değişkenlerin tam tersi tayin etme yapıldıktan sonra kıymeti 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 biçimde bildirilmelidir; bunlar da yerel değişkenler bunun gibi sadece tanımlandığı fonksiyon arasında 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 ira türdendir. a ise fonksiyonun yerel değişkenidir. Formal parametreler fonksiyona kıymet aktarımı yapılacağı süre kullanırlar. Formal bildirim aşağıdaki benzeri de (yeni standart için geçerli) olabilir. Eğer aşağıdaki bunun gibi yazılırsa, her değişkenin önüne çeşidi 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 şekilde 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ü tamamıyla doğru şekilde yazılmış fonksiyon bir kere derlendikten sonra, programın tamamında kullanılırken yine derlenmez; sadece bağlantı kurulur, o anda üzerine değişiklik yapılan fonksiyonun olduğu dosya derlenir. Bir C programında çok sayıda genel değişken olabilir. Program uygun parçalara bölünürken, kullanılacak olan olan genel değişkenler, tüm parçalarda tıpkı isimle bildirilirse derleyici hata verir. Ancak tıpkı genel değişkenlerin tüm parçalarda kullanılması gerekecektir. Böyle durumlarda derleyicinin hata vermemesi için genel değişkenler, parçalanıp ayrı ayrı dosyalar halinde gizlenmiş programın, birinde normal şekilde 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 benzeri yerel değişkenler sırf bildirildiği fonksiyon içerisinde tanınırlar ve ait bulunduğu fonksiyon yürütüldüğü anda bellekte yer işgal ederler. Fonksiyon sonlandığında yerel değişkenlere atanan hafıza gözleri, öbür kullanımlar için yeniden boş hafıza alanına eklenir. Bu nedenlerdir ki, fonksiyon yeniden 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 mevcut ki, yerel değişkenin tuttuğu kıymet kaybolmasın, eski değerini korusun istenir. Bu arzu daha herşeyden ö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 devamlı yer ayrılır. Yani, statik yerel değişkenler genel değişkenler benzeri programın yürütülmesi boyunca bellekte yer işgal ederler. Ancak genel değişkenler bunun gibi öbür fonksiyonlarca tanınmazlar. Bu tür değişkenler, bilhassa açılımlarla (matematikteki süratli açılımları) ilgili yada kütüphaneye koymak amacıyla programcı aracılığı ile yazılan fonksiyonların yazımında yararlıdır. Yukarıdaki fonksiyon her çağrılmasında bir herşeyden önce gönderdiği değerin 5 fazlasını gönderir. Fakat ilk çağrıldığında göndereceği kıymet rastgele olacaktır; bazı derleyiciler de ise ilk çağrılmasında sıfır kıymeti verilir. Yani static türden değişkenlere de öbür değişken bildirimlerinde bulunduğu benzeri sıfırdan türlü başlangıç kıymeti 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ı sağlayan fonksiyonun yazımı verilebilir. Fibonacci serisinin ilk iki elemanının kıymeti 1’dir; öbür elemanları kendisinden hemen herşeyden ö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 şekilde bildirilmiş olup başlangıç kıymeti şekilde 1 sayısı verilmiştir. Fonksiyon ilk çağrıldığında serinin üçüncü elemanını verir. Eğer f1 ve f2 statik şekilde bildirilmez ise fonksiyon her çağrılışında 2 sayısını gönderir. Statik değişkenlere başlangıç kıymeti verilirse, o değerler fonksiyon ilk çağrıldığında değişkene atanır; dha sonra kş çağırmalarda başlangıç kıymeti verilmemiş bu 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 ira 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 hafıza gözü kullanılmaz; direkt 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ı benzeri çok fazla uygulanan 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 öbür değişkenler fonksiyonun yerel değişkenleri olan m ve n’dir. Görüldüğü benzeri dört tane saklayıcı türden değişken bildirilmiştir. En fazla kaç tane bildirileceği işlemciye ve uygulanan derleyiciye bağlıdır. 16 bitlik işlemcilerde genellikle en fazla iki tane kullanılabilir; iki taneden fazla önemsenmez, saklayıcı türden bulunmadığı 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, hafıza gözlerinin adresi vardır. Dolayısıyla, sırf 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) hafıza kullanması ve sürat 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) ya da herhangi bir etraf birimi anlamında değiştiriliyorsa istenmeyen hatalar oluşabilir. Program, genel şekilde 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.


Yapılan Yorumlar
Erdem OFLAZ

Bir mum, diğer mumu tutuşturmakla ışığından bir şey kaybetmez.
 Kategoriler
 Popüler yazılar