Bu sayfadaki yazılar
Sayfanın metni
Sayfa 54
(2) Eğer parametrede yer alan değişkenin değeri dışarı gönderilecekse bu değişken DEĞİŞKEN PARAMETRE tipinde olmalıdır. Bu tür bir parametreyi çıkış parametresi olarak adlandırabiliriz. (3) Eğer modüle gönderilen bilgi işlenerek geri gönderilecekse o zaman DEĞİŞKEN PARAMETRE kullanmak gerekir. Bu tür bir parametreyi giriş/çıkış parametresi olarak adlandırabiliriz. Bir DEĞİŞKEN parametresine karşılık gelen parametrenin sadece değişken olması gerektiğini, kesinlikle bir ifade veya sabit olmaması gerektiğini söylemiştik. Eğer değişkenin değeri değişirse bir ifadenin veya sabitin değişmesi gerekeceğinden bu çok saçma olurdu. Bu yüzden değişken parametrelerde sadece değişken kullanabiliyoruz.
PROCEDURE VERİ BÖLGESİ
Her modül çağrılışında, o modülün verilerini saklamak için hafızanın bir bölümü ayrılır. Bu bölgede modülde yer alan bölgesel değişkenler ve modülde bildirilecek sabitler için yer bulunur. Modülden çıkıldığında ayrılmış olan hafıza bölgesi silinir. Modül çağrıldığında ise bu bölge yeniden tanımlanır. Bu yüzden modül çağrıldığında modüle ait değişkenlerin değerleri tanımlanmamıştır.
PARAMETRE KURALLARI
Modülün çağrıldığı komutla, modülün başında yer alan parametre listesindeki değişkenler birbirine karşı gelir. (1) Her iki tarafta da aynı sayıda parametre olmalıdır. (2) Birbirine karşı gelen parametrelerin veri tipleri aynı olmak zorundadır. (3) DEĞİŞKEN PARAMETRE'ye karşı gelen parametre sadece değişken olmak zorundadır. DEĞER parametresine karşı gelen parametre değişken, sabit veya bir ifade olabilir.
İÇ İÇE MODÜLLER
Şimdiye kadar modüllerimizi ana programdan sonra tanımlamıştık. Gerçekten modüllerimiz de kendi başlarına ufak birer program olduklarından onlar da kendi içlerinde modüller tanımlayabilirler.
PROGRAM ICICE;
VAR X,Y :REAL; PROCEDURE DIS(VAR X :REAL); VAR
M,N :İNTEGER; PROCEDURE IC(X :REAL); VAR N, O :İNTEGER; BEGIN (* IC *)
END; (* IC *) BEGIN (* DIS *)
END; (*1C*) BEGİN (* DIS *)
END; (* DIS *) PROCEDURE MINIMODUL; CONST BOSLUK (* MINIMODUL *)
EN! (* MINIMODUL *) BEGIN (* ICICE *)
END. (* ICICE *)
BLOK HER DEĞİŞKENİN ANLAMI
İÇ — modülünün parametresi) N,O (bölgesel değişkenler) İÇ (DIŞ modülünde tanımlanan modül) Y (İÇİÇE programında tanımlanmış değişken) DIŞ (İÇİÇE programında tanımlanmış modül) DIŞ — X (DIŞ modülünün parametresi) M,N (bölgesel değişkenler) İÇ (bölgesel modül) Y (İÇİÇE programında tanımlanmış değişken) DIŞ (İÇİÇE programında tanımlanmış modül) MİNİMODÜL BOŞLUK (bölgesel sabit) X,Y (genel değişkenler) DIŞ, MİNİMODÜL (İÇİÇE programında tanımlanmış modüller) İÇİÇE X, Y (genel değişkenler) DIŞ, MİNİMODÜL (İÇİÇE programında tanımlanmış olan modüller)
DEĞİŞKENLERİN ETKİ ALANI
Bir FUNCTION veya PROCEDURE başlığını izleyen tanımlamalar, bildirimler ve komutlar dizisine BLOK adını veriyoruz. Bir değişken sadece bildirilmiş olduğu blokta geçerlidir. Bu değişkeni sadece bildirilmiş olduğu blokta kullanabiliriz. Değişkeni içeren bloğun dışında bu değişkeni kullanmak anlamsız olur. Değişkeni kullanabildiğimiz program parçası değişkenin etki alanı içindedir. Bu durumda bir değişkenin etki alanı tanımlandığı bloğu içerir.
PROCEDURE HESAPYAZ; VAR
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 55
M:İNTEGER; PROCEDURE HESAP; VAR SONUC 1: INTEGER; BEGIN
END; BEGİN
END;
Örneğimizde iki blok bulunuyor. İlk blok HESAPYAZ modülünün bildirimi ile başlıyor ve HESAP modülünü de kapsıyor. İkinci blok HESAP modülü ile başlıyor ve HESAPYAZ modülünün içinde kalıyor. HESAPYAZ modülünde bir tek M değişkeni tanımlandı. Bu değişken hem HESAP hem de HESAPYAZ modülünde kullanılabilir. SONUÇ ve I değişkenleri HESAP modülünde tanımlandılar ve sadece bu blok içinde kullanılabilirler. Başka bir deyişle, I veya SONUÇ değişkenlerini HESAPYAZ bloğunda kullanmanın bir anlamı yok.
Her iki değişken de bu bloğun her yerinde kullanılabilirler. Bu bloğun dışında, ana program da dahil hiçbir yerde kullanılamazlar. PROCEDURE ve FUNCTION'ların yapıları blok halinde olduklarından bunlar kendi içlerinde PROCEDURE veya blokları içerebilirler. İÇİÇE, DIŞ, İÇ, MİNİMODÜL bloklarından oluşan örneğimizi inceleyelim. Bu örnekte içiçe modülleri görmüştük.
Ana programı oluşturan İÇİÇE bloğunda tanımlanmış olan X ve Y değişkenleri tüm bloklarda kullanılabilirler. M ve N değişkenleri, DIŞ bloğunda tanımlanmasına rağmen hem DIŞ bloğunda hem de İÇ bloğunda kullanılabilirler, çünkü DIŞ bloğunu da içermektedir. N ve O değişkenleri sadece İÇ bloğunda kullanılabilirler. BOŞLUK sabiti ise sadece MİNİMODÜL bloğunda kullanılabilir. Bir PROCEDURE veya FUNCTION ismi, içinde bulunduğu blokta tanımlanmış olarak kabul edilir. Fakat bu modüller içinde bulunan yöresel değişkenler ve PARAMETRE değişkenleri yeni yapılmış olan modülde tanımlanmış olurlar. Bunu bir örnekle görelim:
FUNCTİON E(K,I,İ:İNTEGER): İNTEGER; P, M, N BEĞİN END;
F, bu fonksiyonu kapsayan blokta tanımlanmıştır. Ancak I, J, K, M, N ve P değişkenleri F bloğunda tanımlanmışlardır.
DEĞİŞKENLERİN ÇOKLU TANIMLANMALARI
Aynı isme sahip bir değişken farklı bloklarda tanımlanabilir. Mesela X bir değişken sadece bildirildiği blokta geçerlidir. Bu değişkeni sadece bildirildiği blokta kullanabilirsiniz.
X değişkeni İÇİÇE programında genel olarak tanımlanırken DIŞ ve İÇ modüllerinde de PARAMETRE değişkeni olarak tanımlandı. Programda X değişkeni kullanıldığında hangi tanımlamanın öncelik taşıyacağını merak edebilirsiniz. PASCAL'da bu durumlar için bir kural oluşturulmuş: Programın belirli bir yerinde aynı isme sahip değişkenler tanımlı ise, o zaman en ufak alana sahip değişken geçerli olur. Bizim örneğimizde İÇ modülünde X değişkeni kullanılırsa bu X değişkeni İÇ modülünde tanımlanmış olan değişkendir. PROCEDURE veya isimleri de birer belirteç olduklarından, bunlar için de Değişkenlerin Etki Alanı Kuralı'nı uygulayabiliriz. DIŞ modülü ana programda tanımlandığı için her yerde çağrılabilir. İÇ modülü DIŞ modülünün içinde tanımlandığından sadece kendisi veya DIŞ modül tarafından çağrılabilir. Mesela MİNİMODÜL bloğunda İÇ modülünü kullanmayı denersek SYNTAX ERROR ile karşılaşırız. Bunun sebebi bir belirteç kullanılmadan evvel tanımlanmasıdır. Görmüş olduğumuz gibi farklı bloklarda kullanıldığı sürece PASCAL, aynı isimde değişken, sabit veya belirteç kullanmamıza izin verir. Fakat PASCAL izin veriyor diye tüm bloklarda değişkenlere aynı isimleri vermek hiç de doğru değildir. Farklı isimler torbaya girmediğinden tüm değişkenlere aynı ismi vermek yerine her birine farklı farklı isimler vermek yerinde olacaktır.
PASCAL için modüler bir programlama dili demiştik. Modüler bir programlama dili olduğu için de, aynı anda farklı farklı programcılar bir programın farklı modüllerini hazırlayabilirler. Bu arada birbirlerinden habersiz olarak farklı değişkenlere aynı ismi verebilirler. Bu gibi durumlar için PASCAL hangi değişkenin kullanılacağını belirler. Bu sayede aynı anda farklı programcılar bir karışıklık çıkmadan programın farklı modüllerini hazırlayabilirler.
GENEL DEĞİŞKENLER
Bir FUNCTION veya PROCEDURE'da tanımlanan değişkenlerin o PROCEDURE veya FUNCTION'a ait bölgesel değişkenler olduğunu söylemiştik.
Bir FUNCTION veya PROCEDURE içinde tanımlanmamış, ancak bunlar tarafından kullanılabilen değişkenlere de GENEL değişkenler demiştik. Genellikle bu tür değişkenler ana programda tanımlanırlar.
Bir FUNCTION veya PROCEDURE'da bulunan komutlar genel bir değişkeni eğer aynı isimde başka bir bölgesel değişken yoksa kullanabilirler. Bu komutlar genel değişkenlerin değerlerini kullanabildikleri gibi, bunlara yeni değerler de verebilirler.
Modüllerle ana program arasında veri alış-verişi için ikinci bir yol olarak genel değişkenleri kullanıyoruz. Bir modülü çağırmadan evvel modüle gönderilecek verileri genel değişkene yükleriz. Aynı genel değişkenlere modüle elde edilen veriler yüklenir. Bu şekilde, modülden çıkıldığında gerekli değerler ana programa iletilmiş olur. Bu uygulamanın sakıncalarına gelecek yazımızda değineceğiz.