Ada Programlama Dili Temelleri

Bölüm 3

Standard Pakette Tanımlanan Öntanımlı Veri Tipleri

Bölüm 3 Sayfa 1

3.1 - Boolean Veri Tipi

Standard paketin görünebilir kısmında tanımlanan Boolean veri tipinin tanımı aşağıda görülmektedir :

   type Boolean is (False, True);
   -- The predefined relational  operators for this type are as follows:
   -- function "= "   (Left, Right : Boolean'Base) return Boolean;
   -- function "/="  (Left, Right :  Boolean'Base) return Boolean;
   -- function "<"    (Left, Right : Boolean'Base) return Boolean;
   -- function "<="  (Left,  Right : Boolean'Base) return Boolean;
   -- function ">"    (Left, Right : Boolean'Base) return Boolean;
   -- function ">="   (Left, Right : Boolean'Base) return Boolean;
   -- The predefined logical  operators and the predefined logical
   -- negation operator are as  follows:
   -- function "and"  (Left, Right : Boolean'Base) return Boolean'Base;
   -- function "or"   (Left, Right : Boolean'Base) return Boolean'Base;
   -- function "xor"  (Left, Right : Boolean'Base) return Boolean'Base;
   -- function "not " (Right : Boolean'Base) return Boolean'Base;

Bu tanım, Boolean veri tipinin bir sayılabilir (enumeration) veri tipi olduğunu belirtir. Boolean veri tipi, Standard pakette tanımlanmış olan tek sayılabilir veri tipidir. Boolean tipi dışında tüm sayılabilir veri tipleri, kullanıcılar tarafından tanımlanmış, kullanıcı tanımlı verilerdir ve kullanıcı tanımlı veriler kategorisinde inceleneceklerdir. Fakat, Boolean veri tipi, sayılabilir bir veri tipi olduğu için, Boolean tipinin iyi anlaşılması için önce sayılabilir veri tiplerinin kısa bir tanıtımı yararlı olacaktır.

Sayılabilir veriler

type Aylar is (OCAK , ŞUBAT ,  MART , NİSAN);
		

şeklinde tanımlanır. Bu tanım, Standart pakette, yukarıda görülen

type Boolean is (False, True); 
		

şeklinde Boolean veri tipi tanımı ile aynıdır. Sayılabilir verilere, Aylar(MART), Boolean(False) şeklinde erişilir. Aylar(MART) ifadesinin değeri MART, Boolean(FALSE) ifadesinin karşılığı False (FALSE) değeridir.

Boolean (mantıksal) veri tipi gibi sayılabilir veri tipleri ayrık (discrete), tek boyutlu (skaler) veri tipleridir. Ayrık tipler sadece sayılabilir ve tamsayı tiplerini, skaler tipler de sayılabilir, tamsayı ve ondalıklı sayı tiplerini kapsarlar.

Sayılabilir verilere, 0 dan başlayan konum sıraları verilir. Böylece, Aylar veri tipinin ilk elemanı olan OCAK elemanının konum sırası 0, onu izleyen ŞUBAT elemanının konum sırası 1 kabul edilir. Aynı şekilde, Boolean veri tipinin False elamanın konum sırası 0, True elemanın konum sırası 1 olarak kabul edilir.

Sayılabilir verilerin önce tanıtılmış elemanları izleyenlerden büyük sayılır. Bu durumda, Aylar veri tipinin OCAK elemanı, ŞUBAT elemanından büyük, Boolean veri tipinin False elmanı, True elemanından büyük sayılır. Bu sadece Ada programa dili için yapılmış bir kabuldür. Yoksa, gerçek yaşamda, yanlış doğrudan daha geçerli olamaz.

Boolean veri tipi, Standard pakette tanıtılmış olan tüm öntanımlı veri tipleri gibi, isimsiz (anonim) (eski Grekçe) veri tipleridir. Oysa, Aylar gibi tüm kullanıcı tanımlı veri tipleri bir isim verilerek tanımlanmış veri tipleridir.

Standart pakette, sayılabilir veri tipleri için bir kök tip tanımlanmamıştır. Bu durumda, tüm sayılabilir veri tipleri özgün bir kök tip olarak hareket ederler. Boolean sayılabilir veri tipi de mantıksal tip olarak adlandırılan bir sayılabilir veri tipidir. Boolean veri tipinden türetilecek alt veri tipleri de birer mantıksal tip niteliğinde olacaktır. Çünkü, Boolean tipinin alt tipleri de, kendisi gibi sadece True ve False gibi mantıksal değerler içerebilecektir.

Bilgisayar programlamasında mantıksal değerlerin önemi büyüktür. Mantıksal değerler, açık/kapalı tipinden tüm anahtarlamalı işlemler için temel değerleri oluşturular. Örnek olarak modern yapısal (structural) programlama tekniği, programın akış yönünün mantıksal olarak belirlenmesine dayanır. Yapısal programlama tekniğinde bir değişkenin değeri True ise program bir yöne doğru, False ise başka bir yöne doğru dallanır. Bu konuda, çok basit bir uygulama aşağıda görülmektedir:

procedure b3_1_uyg_1 is

Kontrol : Boolean := False

begin

 -- programın belirli bir yerinde

Kontrol := True -- Kontrol Değişkeni Değer Değiştirdi !!

-- Program Yönünün Değişmesi (Dallanma)

-- Kontrol Değişkenin Değeri False Olduğunda Gerçekleşecek İşlemler ...

end b3_1_uyg_1;
		

Bu şekilde, yapısal programlarda, program içinde sürekli değeri değiştirilebilen mantıksal tipte değişkenlerinin değerleri izlenerek programın akış yönü değiştirilebilmektedir.

Bilgisayara programlarında, veri tipleri birbirleri ile uyumlu nesnelerin karşılaştırılmaları, Doğru/Yanlış (True/False) olarak bir mantıksal sonuç verir. Bu sonuç programın yön değiştirmesinde kullanılabilir. Mantıksal değişkenlerin önemi burada açık olarak görülmektedir.

Mantıksal değerler, sayısal ve sözel değerler değildir. Kendi sayılabilir veri tiplerinin elemanlarıdır. Sayılabilir değerlerin görüntülenmesi için, Standard pakette tanımlı sayısal ve sözel verilerin görüntülenme yöntemleri kullanılamaz. Sayısal veriler, ya Standart pakette generik sayılabilir veriler için tanımlanmış giriş/çıkış paketinin, Boolean gibi, Aylar gibi özgün sayılabilir veri tipleri için oluşturulmuş özgün örneklerinden veya Image niteliklerinden yararlanılarak sözel hale dönüştürülü, Standart pakette, sözel verilerin görüntülenmesi için tanımlanan Ada.Text_IO öntanımlı paketinden yararlanılarak görüntülenebilirler. Her iki yöntem de çok kolaylıkla uygulanabilmektedir ve uygulama örneklerini birlikte oluşturacağız.

İlk olarak Boolean veri tipi gibi sayılabilir veri tiplerinin giriş/çıkış işlemleri için Ada.Text_IO öntanımlı paketinin Enumeration_IO generik alt paketinin, Boolean veri tipi için nasıl özgün bir örneğinin yaratılabileceğini inceleyeleim. Öntanımlı Ada.Text_Io paketi, Ada 2012 spesifikasyonu Annex A, Bölüm A.10 da verilmiştir. Bilindiği gibi, bu referans el kitabı, ek2 de de PDF olarak verilmiştir. Ayrıca, Bölüm 2.17 de Ada.Text_IO öntanımlı paketinin tam listesi verilmiştir. Sayılabilir verilerin giriş/çıkış işlemleri için özgün paket geliştirilmesi, örneklerle ek3 de ayrıntılı olarak açıklanmıştır. Bütün bu bilgilerin incelenmesi çok yararlı olacaktır. Burada başlangıçtan başlayarak özgün paket örneğinin yaratılmasını yeniden inceleyeceğiz.

Sayılabilir veri tiplerinin giriş/çıkış işlemleri için Ada.Text_IO öntanımlı paketinin gerekli kısımları aşağıda görülmektedir.

ISO/IEC 8652:201z(E) Ed. 3 - Ada Reference Manual
A.10.1 The Package Text_IO 11 June 2010 400
...
subtype Field is Integer range 0 .. implementation-defined;
..
type Type_Set is (Lower_Case, Upper_Case);
...
-- Generic package for Input-Output of Enumeration Types
generic
type Enum is (<>);
package Enumeration_IO is
Default_Width : Field := 0;
Default_Setting : Type_Set := Upper_Case;
procedure Get(File : in File_Type;
Item : out Enum);
procedure Get(Item : out Enum);
procedure Put(File : in File_Type;
Item : in Enum;
Width : in Field := Default_Width;
Set : in Type_Set := Default_Setting);
procedure Put(Item : in Enum;
Width : in Field := Default_Width;
Set : in Type_Set := Default_Setting);
procedure Get(From : in String;
Item : out Enum;
Last : out Positive);
procedure Put(To : out String;
Item : in Enum;
Set : in Type_Set := Default_Setting);
end Enumeration_IO;
--

Yukarıdaki tanımı incelediğimizde, Ada.Text_IO paketinde, Enumeration_IO adında bir alt paket tanımlanmış olduğu görülüyor. Bu alt pakete Ada.Text_IO.Enumeration_IO şeklinde erişebiliriz. Bu alt paket, Enum isimli bir soysal (generik) sayılabilir veri tipi için geliştirilmiştir. Soysal değişkenler bir tür yol gösterici gibidir. Soysal değişkenlerlerle çalışabilir nesneler (objects) yaratılamaz. Çalışabilir nesneler, gerçek değerlerle oluşturulmalıdır. Bu nedenle, soysal Enum veri tipi yerine, gerçek Boolean veri tipinin görüntülenmesini sağlayabilecek bir çalışabilir nesne olan özgün paketin oluşturulması ile çalışmamıza başlayacağız. Bu da son derece kolay bir işlem olacaktır.

Soysal veri tipleri için tanımlanmış paketlerden, gerçek veri tipleri için çalışabilir gerçek paketlerin oluşturulması için,

Argümanın isim olarak belirtilmesi durumunda,

<özgün_paket_adı> is new <soysal_paket_adı>(generik_veri_tipi => özgün_veri_tipi);

Argümanın tanım sırası ile belirtilmesi durumunda,

<özgün_paket_adı> is new <soysal_paket_adı>(özgün_veri_tipi);

yönteminin uygulanması yeterlidir. Her iiki yöntem de geçerlidir. Çoğunlukla sonuncu şekil uygulanmaktadır. Buna soysal bir paketin, özgün bir tip için örneklenmesi (instantanition) adı verilir. Yani bu işlem bir tür güncellemedir. Doğal olarak, özgün tip, soysal tiple uyumlu olmalıdır. Burada Enum soysal veri tipi ile Boolean gerçek veri tipi aynı sayılabilir veri tipinde olduklarından, veri tipleri birbirleri ile aynı ve dolayısı ile birbirleri ile uyumludurlar. Bu durumda, Boolean sayılabilir verilerinin görüntülenmesi işlevini yapabilecek Boolean_IO adını verceğimiz bir paket örneklemesi,

package Boolean_IO is new Ada.Text_IO.Enumeration_IO(Boolean);
		

şeklinde yaratılabilir. Ada.Text_IO_Enumeration_IO gibi soysal (generik) bir paketten Boolean_IO adında yeni bir paket örneklemesi yapıldığında, soysal tipin yerine özgün tip geçmesinin dışında, tüm argümanlar aynı kalır. Değişen sadece kullanılacak veri tipidir. Paketin iç işleyişi de aynen orijinal soysal paketin işleyişi ile aynı kalır. Ayrıca, Ada.Text_IO paketinin sadece spesifikasyon kısmı yanı özellikler, metotlar ve argümanları kulanıcıya açıktır. Paketin iç işleyişi kendini ilgilendirir ve kodları da kullanıcılara açılmamıştır. Yani, paketin metotları üzerine, işleyişini belirten açıklamalardan başka bilgimiz yoktur. Çoğunlukla bu açıklamalar da yeterli değildir ve kullanıcılar, paketin değişken ve sabitlerini (özellklerini), metotların ve argümanların işlevini kendileri deneyip bulmak zorunda kalabilirler.

Şu anda, elimizde Boolean_IO adında Boolean verilerin monitörde görüntülenmesi sağlayabilien ve aynı Ada.Text_Io.Enumeration_IO generik paketinin işleyişine sahip bir paketimiz oluştu. Bu paketi gereksinmelerimiz için kullanabiliriz. İlk gereksinmemiz, Boolean tipte verilerin monitörde görüntülenmesini sağlayan bir metot olabilir.

Boolean_Io paketinde, Boolean tipinde veriler için, monitör çıkışlarını sağlayan metot Put metodu olarak tanımlanmıştır. Put metodu Ada.Text_IO paketinde de olduğu için, bir prosedürde, with Ada.Text_IO; use Ada.Text_IO; with Boolean_IO; use Boolean_IO; şeklinde toplam içiçe çalışma bildirimi, Put metodu çağrıldığında bir isim çakışması (name clash) yaratır ve derleyici hangi metodun put metodunun çağrıldığını argümanlarını inceleyerek saptamaya çalışır. Buna isim uzayı kirlenmesi (namespace pollution) adı verilir. Yani her iki paketinin bir prosedürde birlikte kullanımının (with) hiçbir sakıncası yoktur. Çünkü bu durumda, derleyiciye prosedürün geldiği paketin bildirilmesi gerekir, dolayısı ile isim çakışması önlenmiş olur. Fakat içiçe kullanılması (use) önerilmez, çünkü isim çakışması ve isim uzayı kirlenmesi yaratılmış olur.

Yeni yaratılmış olan, Boolean_IO özgün paketinde, mantıksal verilerin monitörde görüntülenmesini sağlayan Put metodunun, üç tane argümanı (parametresi) vardır. Bu metodun çağrılması,

procedure Put(Item : in Boolean; Width : in Field := Default_Width; Set : in Type_Set := Default_Setting);

şeklindedir. Burada, ikinci ve üçüncü argümanların varsayılan değerleri olduğundan, bu varsayılan değerler değiştirilmeyecekse, bu argümanların (parametrelerin) kullanımına gerek olmayacaktır. Bu durumda, Put prosedürünün çağrılması,

procedure Put(Item : in Boolean;);

şekline indirgenmiş olacaktır. Bunu hemen bir uygulamada deneyelim:

with Ada.Text_IO;
		
procedure b3_1_uyg_2 is

Kontrol : Boolean := False;

package Boolean_IO is new Ada.Text_IO.Enumeration_IO(Boolean);

begin

Ada.Text_IO.Put(Item => "Kontrol Değişkeninin Değeri :  ");

Boolean_IO.Put(Item => Kontrol);

end b3_1_uyg_2;
		

Bu programın sonucu,

Kontrol Değişkeninin Değeri :   FALSE
		

olmaktadır. Bu sonuç, özgün paket oluşturma mekanizmasının çalıştığını ve mantıksal nesnelerin değerlerinin ekrana yazdırılabileceğini belirtir.

Ada.Text_IO_Enumeration_IO generik paketinin ikinci argümanı (parametre olarak da adlandırılmaktadır) Width parametresidir. Width parametresinin varsayılan değeri Default_Width olarak açıklanmıştır. Enumeration_IO paketinde Default_Width değerinin veri tipi Field ve başlangıç değerinin = 0 olduğu belirtilmiştir. Field veri tipi, Ada_Text_IO programında kullanıcı tipi bir tamsayı tipi olarak tanımlanmıştır. Bu tanımda, Field parametresinin bir öntanımlı Integer (tamsayı) veri tipi olduğu, kapsam aralığının ise 0 ile çalışılan sistem için desteklenen en yüksek değer arasında olabileceği belirtilmiştir. Bu durumda, Width parametresinin veri tipi kısıtlı (bounded) kapsam aralığı olan kullanıcı tanımlı bir tamsayı veri tipidir. Bu parametrenin Default_Width varsayılan değeri 0 olarak belirtilmiştir. Field veri tipinin en küçük değeri 0 olabileceği için bu değer, Field veri tipinin kapsam aralığında geçerli bir değerdir. Width parametresi yazdırılacak verinin karakter sayısını belirtir. Eğer, verinin karakter sayısı Width parametresinden büyük ise, tüm veri görüntülenir. Eğer, verinin karakter sayısı Width parametresinden küçük ise, aradaki fark kadar boşluk karakteri verinin sağına eklenir.

Width parametresinin veri tipi olan Field veri tipi, Ada_Text_IO paketinde tanımlıdır. Bu tanım global bir tanımdır ve Ada_Text_IO paketinin bir alt paketi olan Enumeration_IO paketinde de geçerlidir. Bu yüzden, Enumeration_IO alt paketinde, Default_Width değeri nin veri tipinin Field veri tipi olduğu belirtilebilmiş ve varsayılan değer olarak 0 değeri verilebilmiştir. Fakat, Enumeration_IO soysal alt paketinden özgün Boolean_IO paketi örneklendiğinde durum değişir. Boolean_IO artık prosedürün içinden çalıştığı bağımsız bir paket niteliği kazanır. Ada_Text_IO paketi ile ilgisi kesilir ve Field veri tipi Boolean_IO gerçek paketinde tanımlı değildir. Yani, Boolean_IO paketininin içinden Put metodunun Width parametresinin değerini, varsayılan 0 değerinden başka bir değer değiştirmek istesek bunu yapacak yetkide olamamamız gerekir. Çünkü Width parametresinin veri tipi Boolean_IO paketinde tanımlı değildir. Burada bir kolaylık imdadımıza yetişir. Field veri tipi bir tamsayı veri tipidir. Boolean_IO paketi içinden Width parametresine tamsayı literali değerler atanmaktadır. Tamsayı literallerinin veri tipi Universal_Integer olarak kabul edilir ve bu veri tipi tüm tamsayılarla uyumludur. Bu kolaylık bize, hernekadar Width parametresinin veri tipinin Boolean_IO paketi içinde tanınmıyorsa da, Boolean_IO paketi içinden Width parametresine atanacak tamsayı değerinin veri tipinin Field veri tipinde değil Universal_Integer tipinde olduğunu ve bu yüzden Field veri tipi ile uyumlu olarak Width parametresine atanabileceğini belirtir.Width parametresinin bir programda uygulanması aşağıda verilmiştir.

with Ada.Text_IO;
		
procedure b3_1_uyg_3 is

Kontrol : Boolean := False;

package Boolean_IO is new Ada.Text_IO.Enumeration_IO(Boolean);

begin

Ada.Text_IO.Put(Item => "Kontrol Değişkeninin Değeri :  ");

Boolean_IO.Put(Item => Kontrol, Width => 10);

Ada.Text_IO.Put(Item => "Güncel Değer !");


end b3_1_uyg_3;
		

Bu programın sonucu,

Kontrol Değişkeninin Değeri :  FALSE     Güncel Değer !
		

olmaktadır. Bu sonuç, programın çalıştığını belirtmektedir. Beş karakterleri verinin sonuna beş boşluk karakteri eklenerek mantıksal değişkenin sonucu yazdırılmıştır.

Boolean_IO gerçek paketinin Put metodunun son argümanı Set parametresidir. Buparametresinin veri tipi, Ada_Text_IO paketinde Type_Set olarak tanımlanmış bir saılabilir veri tipidir. Bu veri tipinin iki tane elemanı vardır ve bunlar (Lower_Case, Upper_Case) olarak tanımlanmışlardır. Set parametresinin başlangıç değeri Default_Setting değeridir. Bu değer Enumeration_IO generik alt paketinde Upper_Case olarak tanımlanmıştır. Generik Enumeration_IO alt paketinden Boolean_IO paketi örneklendiğinde, Set parametresinin varsaılan değeri de Upper_Case olarak sabitlenmiş olacak ve bu parametrenin değeri değiştirilmedikçe, Boolean_IO paketinin Put metodu, mantıksal değerleri büyük harflerle görüntüleyecektir.

Set parametresinin değerini Boolean_IO paketi içinden değiştirmek istendiğinde sorunla karşılaşılır. Set parametresinin veri tipi olan Type_Set veri tipi, Boolean_IO paketinden görünebilir değildir. Bu veri tipi sayılabilir bir veri tip olduğundan, Integer veri tipi gibi, her kapıyı açabilecek bir üst sınıf veri tipi de yoktur. Her sayılabilir veri tipi birbirinden bağımsızdır ve tanımlanmış tip en üst sınıf sayılır. Eğer prosedürün birliktelik kısmında, sadece with Ada.Text_IO bidirimi yapılmışsa, bu durumda, Boolean_IO paketi içinden Set parametresinin değerini değiştirmek için, Set parametresinin veri tipi olan Type_Set sayılabilir veri tipinin tanımlandığı ve prosedürün çalışma alanı (context) içinde olan Ada_Text_IO paketininden kaynaklandığı belirten bir tam nitelikli ismin kullanımı gerekir. Bunun en basit yolu, Set => Ada.Text_IO.Lower_Case olarak belirtmektir. Bu bir programda uygulayalım:

with Ada.Text_IO;
		
procedure b3_1_uyg_4 is

Kontrol : Boolean := False;

package Boolean_IO is new Ada.Text_IO.Enumeration_IO(Boolean);

begin

Ada.Text_IO.Put(Item => "Kontrol Değişkeninin Değeri :  ");

Boolean_IO.Put(Item => Kontrol, Width => 10, Set => Ada.Text_IO.Lower_Case);

Ada.Text_IO.Put(Item => "Güncel Değer !");


end b3_1_uyg_4;
		

Bu programın sonucu,

Kontrol Değişkeninin Değeri :  false     Güncel Değer !
		

olmaktadır. Bu sonuç, eğer tam nitelikli isim olarak belirtlirse, Set parametresinin değerinin Boolean_IO paketinden değiştirilebileceğini belirtmektedir.

Bizim için çok doğal olmasına karşın, genellikle tam nitelikli isimlerin kullanılmasının program kodlarının görselliğinin bozduğu düşünülmektedir. Bu durumda, Set parametresinin değeri belirtilirken tam nitelikli isimlerin beliritlmesi gereğinden kurtulmak için, uygulanabilecek yöntemlerden birinin, prosedürün birliktelik bölümünde, with Ada.Text_IO; use Ada.Text_IO; bildiriminin yapılmasıdır. Bu durumda prosedür, Ada.Text_IO paketi ile içiçe çalışır durumda olacağından set parametresine Set => Lower_Case şeklinde tam nitelikli isme gereksinme olmadan değer atanabilir. Fakat bu yöntem Put metodu için isim çakışmasına neden olacak bir isim alanı kirlenmesine neden olacağından, sağlık verilmemektedir. Bu problemin aşılabilmesi için, literatürde şık bir yöntem önerilmiştir. Bu yöntem aşağıdaki uygulamada görülmektedir:

with Ada.Text_IO;
		
procedure b3_1_uyg_5 is

Kontrol : Boolean := False;

package Boolean_IO is new Ada.Text_IO.Enumeration_IO(Boolean);


Küçük_Harf : Ada.Text_IO.Type_Set := Ada.Text_IO.Lower_Case;

use type Ada.Text_IO.Type_Set;

begin

Ada.Text_IO.Put(Item => "Kontrol Değişkeninin Değeri :  ");

Boolean_IO.Put(Item => Kontrol, Width => 10, Set => Küçük_Harf);

Ada.Text_IO.Put(Item => "Güncel Değer !");


end b3_1_uyg_5;
		

Bu programın sonucu,

Kontrol Değişkeninin Değeri :  false     Güncel Değer !
		

olmaktadır. Bu elegan çözümle, hem isim alanı kirlenmesine neden olunmamakta hem de metot parametrelerinin değerlerinin belirtilmesinde tam nitelikli değerlerin kullanımı gereği kalmamaktadır.

Bu bilgilerle, mantıksal değerlerin görüntülenmesinde tüm olanaklar elimizde olmaktadır. Yukarıdaki açıklamalar, henüz fazla anlaşılır olmayabilir. Şu anda bu bilgileri sadece uygulamamız yeterli olacaktır. Konular ilerledikçe yukarıdaki açıklamalar çok kolaylıkla anlaşılabiliecektir.

3.1.1 - Boolean Veri Tipine Uygulanabilen Nitelikler

Boolean veri tipi scaler ve ayrık (discrete) bir veri tipidir skaler (tek boyutlu) tipler, ayrık (discete) tipler olan Sayılabilir(Enumeration) ve Tamsayı (Integer) tipleri ile gerçek sayı (real) tipler olan sabit (Fixed) ve noktalı (Float) veri tiplerini içerir (bk. Ada Veri Sistemi) Bu nedenle Boolean veri tipine skaler veri tiplerine uygun nitelikler uygulanabilir. Burada Boolean veri tipine uygulanabilen bazı nitelikleri inceleyecek ve uygulamalar yapacağız.

İlk inceleyeceğimiz nitelik, Base niteliği olacaktır. Ada programlama dilinde, kullanıcılar, kendi gereksinmelerine göre, öntanımlı veri tiplerinin kapsam kısıtı olan alt tiplerini tanımlayabilirler. Skaler veri tiplerinin Base nitelikleri, bu alt veri tiplerinin temel tiplerinin kapsam kısıtı olmayan ilk alt tiplerini döndürür. Ada programlama dilinde, her temel veri tipinin ilk alt türünün kendisi olduğu kabul edilir. Bu nedenle, Boolean'Base niteliğinin değeri yine Boolean tipidir çünkü, Boolean tipi zaten temel Boolean veri tipinin ilk alt türü kabul edilmektedir. Yani, aslında, Boolean gibi öntanımlı , kullanıcı tanımlı olmayan veri tiplerinin Base niteliklerinin sorgulanması anlamsızıdır, çünkü yanıt yine kendileri olacaktır. Bu nitelik ancak kullanıcı tanımlı alt tipler için anlamlı olabilir. Alt tipleri ileride inceleyeceğiz ve alt tiplerinin Base niteliklerini daha anlamlı uygulamalarını göreceğiz.

Bir skaler alt tip için, Base niteliği aşağıdaki gibi sorgulanabilir:

Boolean veri tipi için Base niteliğinin kullanılması konusunda bir uygulama aşağıda görülmektedir.

with Ada.Text_IO;
		
procedure b3_1_1_uyg_1 is

Kontrol : Boolean := False;

package Boolean_Yaz is new Ada.Text_IO.Enumeration_IO(Boolean);


Büyük_Harf : Ada.Text_IO.Type_Set := Ada.Text_IO.Upper_Case;
Küçük_Harf : Ada.Text_IO.Type_Set := Ada.Text_IO.Lower_Case;
use type Ada.Text_IO.Type_Set;

begin

Boolean_IO.Yaz(Item => Boolean'Base(False), Width => 10, Set => Büyük_Harf);
Ada.Text_IO.Put(Item => "Boolean'Base(False");
Ada.Text_IO.Put.New_Line;

Boolean_IO.Yaz(Item => Boolean(False), Width => 13, Set => Küçük_Harf);
Ada.Text_IO.Put(Item => "Boolean'Base(False");
Ada.Text_IO.Put.New_Line;

Boolean_IO.Yaz(Item => False, Width => 10, Set => Büyük_Harf);
Ada.Text_IO.Put(Item => "Boolean'Base(False");


end b3_1_1_uyg_1;
		

Bu programın sonucu,

FALSE     Boolean'Base(False) Sonucu
false Boolean(False) Sonucu
FALSE False Sonucu

olmaktadır.

Bu sonuçlar, False değerinin görüntülenmesi için Boolean tipi için Boolen'Base niteliğinin trivial olduğunu çünkü Boolean tipinin de aynı sonucu verdiğini göstermektedir. Ayrıca False niteliğinin yazılması için, Boolean'Balse(False) veya Boolean(False) yazılması gereksiz olmakta ve sadece False yeterli olmaktadır.

Skaler veri tiplerinin Base niteliğine daha çok temel veri tipini belirten kuramsal bir tanım olarak bakmak daha gerçekçi olacaktır.

İlk inceleyeceğimiz nitelik, skaler veri tiplerine uygulanabilen nitelikler arasında en yararlı olanlardan birisi olan, Image niteliği olacaktır. Skaler verilerin imaj nitelikleri bu verilerin karakter dizisi (String) tipinden değerlerini döndürür. Bu şekilde, hemen her prosedürün birliktelik (Context) kısmında, prosedürün birlikte çalışılacağı bildirilen Ada.Text_IO paketinnden yararlanılarak bu verilerin sonuçları görüntülenebilecektir. Dolayısı ile, skaler verilerin imaj değerlerine dönüştürülmeleri (mapping) , görüntüleme amacı ile kendi özel paketlerinin soysal paketlerden güncellemelerinin gereğini ortadan kaldırır Özellikle küçük programlar için, imaj nitelikleri çok kullanışlıdır. Skaler bir veri tipinin imaj niteliği aşağıda görüldüğü gibi oluşturulabilir.

function S'Image (Arg : S'Base)
return String; 
		

Aşağıda görülen program, mantıksal bir değerin imajını görüntülemek için Ada.Text_IO paketinden yararlanmaktadır.

with Ada.Text_IO;

procedure b3_1_1_uyg_2 is

Kontrol : Boolean := False

begin
 -- programın belirli bir yerinde

Kontrol := True;

-- Mantıksal tipte Kontrol değişkenin güncel değeri 

Ada.Text_IO.Put(Item =>"Kontrol : "& Boolean'Image(Kontrol));

end b3_1_1_uyg_2;
		

Bu programın sonucu,

Kontrol : TRUE
		

olmaktadır.

Bu programın sonuçlarından Boolean değerlerin görüntülenmesi için, imaj niteliklerinden yararlanılmasının çok kullanışlı olduğu görülmektedir. Mantıksal değerlerin imaj değerleri Büyük harflerle oluşturulmaktadır ve bunu değiştirme olanağımız yoktur. Fakat istenirse, oluşan imaj karakter dizisi veri tipinde olduğundan, karakter dizilerine uygulanabilecek metotların uygulanması ile küçük harflere çevrilmesi olanağı bulunabilir.

Skaler verilerin ilk ve son elemanları, S'First ve S'Last niteliklerinden yararlanılarak sorgulanabilir. Bu iki niteliğin uygulanma yöntemi, aşağıda görülmektedir.

Boolean veri tipinin ilk ve son elemanlarını belirten bir program aşağıda görülmektedir.

with Ada.Text_IO;

procedure b3_1_1_uyg_3 is

begin

Ada.Text_IO.Put(Item =>"Boolean Değişkenlerin En Alt Değeri : "& Boolean'Image(Boolean'First));

Ada.Text_IO.Put(Item =>"Boolean Değişkenlerin En üst Değeri : "& Boolean'Image(Boolean'Last));

end b3_1_1_uyg_3;
		

Bu programın sonucu,

Boolean Değişkenlerin En Alt Değeri : FALSE

Boolean Değişkenlerin En üst Değeri : TRUE
		

olmaktadır.

S'Max ve S'Min fonksiyonları, iki skaler veriyi karşılaştırarak, hangisinin büyük ve küçük olduğunu belirtirler. Bu fonksiyonların tanımları aşağıda görülmektedir.

function S'Max (sol, sağ : S'Base)
return S'Base 
		
function S'Min (sol, sağ : S'Base)
return
		

Boolean veri tipinden iki değer için S'Max fonksiyonun uygulanması aşağıda görülen programda gerçekleştirilmiştir. S'Min fonksiyonun uygulanması da aynı şekilde yapılabilir.

with Ada.Text_IO;

procedure b3_1_1_uyg_4 is

begin

Ada.Text_IO.Put(Item =>"Boolean Değişkenlerin En Büyüğü : " & Boolean'Image(Boolean'Max(False,True)));
			
end b3_1_1_uyg_4;
		

Bu programın sonucu,

Boolean Değişkenlerin En Büyüğü : TRUE
		

olmaktadır.

Bu sonuç, sayılabilir verilerin itibari büyüklerinin, en son tanımlananın en büyük olarak kabul edilmesinden kaynaklanmaktadır. Bu sadece Ada programlama diline özgü bir kabuldür ve asla gerçek yaşam için geçerli değildir.

Boolean veri tipi gibi sayılabilir veri tiplerinin elamanlrının, tantım sıralarına göre 0 dan başlayan sıra numaralarının verildiği belritilmişti. Bu sıra numaralarına S'Pos (Pozisyon Numaraları) (Konum Sayıları) niteliğinin sorgulanması ile ulaşılabilir. Bu niteliğin tanımı aşağıda görülmektedir.

function S'Pos (Arg : S'Base)
return universal_integer
		

Aşağıdaki programda tüm sayılabilir veri tiplerinin elemanlarının konum sayılarının sorgulanması sağlanmaktadır.

with Ada.Text_IO;

procedure b3_1_1_uyg_5 is

begin

Ada.Text_IO.Put(Item =>"Boolean  Veri Tipinin False Elemanının Konum Sayısı  : " & Integer'Image(Boolean'Pos(False)));
			
end b3_1_1_uyg_5;

Bu programın sonucu :

Boolean  Veri Tipinin False Elemanının Konum Sayısı : 0

olmaktadır.
		

Yukarıdaki programın sonucundan da görülebileceği gibi, Boolean veri tipinin Boolean'Pos nietliğinin sorgulanması ile, mantıksal değişkenlere 0 veya 1 şeklinde tamsayı değerleri verilebilmesi olasılığı bulunmaktadır.

Skaler verilerin aynı zamanda ayrık (discrete) olanları, sayılabilir ve tamsayı veri tipleridir. Noktalı değerler alabilen (Real) tipte sayısal veriler, skaler olmakla birlikte ayrık değillerdir. Ayrık ve skaler veri tiplerinin elemanlarının bir çizgi üzerinde dizilmiş olarak yerlerştikleri düşünülürse, bu elemanların bir sonrası S'Succ, bir öncesi S'Pred nitelikleri ile bulunabilir. Bu niteliklerin uygulanma yöntemleri aşağıda görülmektedir.

function S'Pred (Arg : S'Base)
return S'Base
		
function S'Succ (Arg : S'Base)
return S'Base
		

Boolean tipte verilerde True değerinden önceki değeri saptayalım :

with Ada.Text_IO;

procedure b3_1_1_uyg_6 is

begin

Ada.Text_IO.Put(Item =>"Boolean Veri Tipinin True Elemanından Önceki Eleman : "& Boolean'Image(Boolean'Pred(True)));

end b3_1_1_uyg_6;

Bu programın sonucu :

Boolean Veri Tipinin True Elemanınından Önceki Eleman : FALSE

olmaktadır.
		

Skaler ve ayrık veri tiplerinin elemanlarının bir sonraki ve bir öncekinin saptanabilmesi, kullanıcılara büyük kolaylık sağlamaktadır.

Skaler verilerin tanım aralıkları, S'Range niteliğinin değeri olarak geri döndürülür. Bu niteliğin tanımı aşağıda verilmiştir.

S'Range niteliğinin değeri, yeni bir alt veri tipi yaratılırken tanım aralığı olarak belirtilebilir. Bu nitelik değerinin uygulanması, alt veri tipleri incelenirken yapılacakır.

Skaler ve ayrık veri tiplerinin elemanlarının konum sırasından, elemanlarına erişimi sağlayabilen nitelik S'Val niteliğidir. Bu niteliğin uygulanması aşağıda görülmektedir:

function S'Val (Arg : universal_integer)
return S'Base
		

Skaler ve ayrık veri tiplerinin S'Val niteliğinin uygulandığı bir program, aşağıda görülmektedir.

with Ada.Text_IO;

procedure b3_1_1_uyg_7 is

begin

Ada.Text_IO.Put(Item =>"Boolean  Veri Tipinin Konum Sayısı 1 Olan Elemanının Değeri  : " & Boolean'Image(Boolean'Val(1)));
			
end b3_1_1_uyg_7;

Bu programın sonucu :

Boolean  Veri Tipinin Konum Sayısı 1 Olan Elemanının Değeri  : TRUE

olmaktadır.
		

Freansızcadan Türlçeye geçmiş olan restütiasyon sözcüğünün anlamı restorasyon sözcüğüne yakındır. Bu sözcük, orijinal halinden farklı bir hale dönüşmeüş olan bir eşyanın (binanın değil) yeninden eski haline getirilmesidir. Bu işleme binalar için restorasyon adı verilir. Skalr ayerık verilerin restütiasyonu s'Value niteliği ile gerçekleştirilir. Bu niteliğin tanımı aşağıda görülmkektedir.

function S'Value (Arg : String)
return S'Base
		

S'Value niteliği, S'Val ile karıştırılmaması gereken çok ilginç bir hazır fonksiyondur. Normalde epey külfetli olabilecek karakter verisi değerlerinin skaler, ayrık veri tiplerine dönüştürülmesini sağlar. Bu konuda yapılmış olan bir program, aşağıda görülmektedir.

with Ada.Text_IO;
		
procedure b3_1_1_uyg_8 is

package  Boolean_Veri_Çıkışı is new Ada.Text_IO.Enumeration_IO(Boolean);

Küçük_Harf : Ada.Text_IO.Type_Set := Ada.Text_IO.Lower_Case;

use type Ada.Text_IO.Type_Set;

begin

 Boolean_Veri_Çıkışı.Put(Item => Boolean'Value( Boolean'Image(True)), Set => Küçük_Harf);

end b3_1_1_uyg_8;

Bu programın sonucu :

true

olmaktadır.
		

Yukarıdaki program sadece Boolean'Value niteliğinin çalışma şeklinin anlaşılması için yapılmıoş trivial bir programdır. İlk önce Boolean bir değer İmaj niteliği ile sözel bir değere dönüştürülmekte, sözel haldeki değer Boolean'Value niteliği ile aksi yöne, yani yeniden Boolean veri tipine dönüştürülmektedir.

Boolean'Value niteliği, esas faydalı işlevini, karakter dizisi (String) verilerin içeriğinin True veya false gibi yazımı şeklinin önemi olmayan, Boolean veri tipinin elemanlarına denk düşen içerikte olması halinde, bu sözel verileri, Boolean veri tipinin elemanlarına dönüştürerek gerçekleştirir. Bunun için ilk uygulama aşağıda görülmektedir:

with Ada.Text_IO;
		
procedure b3_1_1_uyg_9 is

Gerçek : String(1..12) := "  True     ";


package  Boolean_Veri_Çıkışı is new Ada.Text_IO.Enumeration_IO(Boolean);


Küçük_Harf : Ada.Text_IO.Type_Set := Ada.Text_IO.Lower_Case;

use type Ada.Text_IO.Type_Set;

begin

 Boolean_Veri_Çıkışı.Put(Item => Boolean'Value(Gerçek), Set => Küçük_Harf);

end b3_1_1_uyg_9;

Bu programın sonucu :

true

olmaktadır.
		

Bu programda, girilen veri değerine dikkat etmemiz gerekir. Gerçek değişkenin veri tipi, 12 karakterlik (12 elemanlı) bir karakter dizisi olacaktır. Bu değişkene atanacak değer de tam olarak 12 karakterlik olmalıdır. Girilen sözel değer daha fazla karakterde ise hata oluşur. Karakter sayıs daha az ise, önüne ve/veya ardına boşluk karakterleri eklenir. Gerçek değişkenine atanan öndeğer de bunun için (2+ TRUE +5 ) = 12 karakterlik bir sözel değerdir.

Prosedürde, Boolean'Value hazır fonksiyonun ( niteliğin tam karşılığı budur) argümanı olan sözel verinin 12 karakterden oluştuğunu, bunun ilk iki karakterinin boşluk, bunu izleyen 5 karakteri true, bunu izleyen 5 karakterin yine boşluk olduğu görülebilir. Oysa oluşturulacak Boolean veri tipi elemanı TRUE sadece 5 karakter içermektedir. Bunun bir önemi yoktur çünkü, Boolean'Val hazır fonksiyonu öndeki ve sondaki boşluk karakterlerini temizleyerek uygun mantıksal değeri oluşturabilmektedir. Problemin sonucu da bunu belirtmektedir.

Bir skaler tipin imaj niteliğinin döndüreceği karakter dizisinin (String) uzunluğunun olabileceği en yüksek değer, S'Width niteliği ile sorgulanabilir. Bu niteliğin tanımı aşağıda görülmektedir.

Boolean veritipinin maksimum imaj genişliklerinin belirlenmesi, aşağıda görülen bir programda gerçekleştirilmektedir.

with Ada.Text_IO;

procedure b3_1_1_uyg_10 is

begin

Ada.Text_IO.Put(Item =>"Boolean Veri Tipinin Yaratabileceği Sözel İmajın Maksimum Karakter Uzunluğu  : " &  Integer'Image(Boolean'Width) & "  Karakter.");
			
end b3_1_1_uyg_10;

Bu programın sonucu :

Boolean Veri Tipinin Yaratabileceği Sözel İmajın Maksimum Karakter Uzunluğu :  5    Karakter.


olmaktadır.
		

Bu sonuç, Boolean veri tipinin iki elemanından en uzunu olan 5 karakterli False elemanın karakter sayısıdır. Boolean veri tipinin oluşturabileceği imaj değerlerinin en uzunu 5 karakter olabilecektir. Sadece iki eleman olduğundan, diğer True elemanının oluşturacağı imaj değerinin uzunluğu 4 karakter olabilmektedir. Bu şekilde, Boolean'Width niteliği, Boolean veri tipinin oluşturabileceği imaj değerlerinin en yüksek olabileceği karakter sayısı olan 5 değerini döndürmektedir.

En sona bıraktığımız nitelik, Size niteliğidir. Bu nitelik düşük düzey bilgi verdiği için genel amaçla kullanılmaz. Sadece çalışılan sistem üzerine bilgi almak amacı ile yararlanılır. Bu nitelik veri tipi için kullanıldığında, bu tipin kullanılacağı bit sayısınıdöndürür. Size niteliği, bir tipin uygulanabilir bir nesnesi, örnek olarak bir değişken veya sabiti üzerine uygulanırsa, bu nesnenin bellekte kapladığı bit sayısını döndürür. Bu konudaki bir uygulama, aşağıdaki programda verilmiştir.

with Ada.Text_IO;

procedure b3_1_1_uyg_11 is

İşaret_Bayrağı : constant Boolean := False;

begin

Ada.Text_IO.Put(Item =>"Boolean  Veri Tipinin Bellekte kaplayacağı bit Sayısı  :      " & Integer'Image(Boolean'Size));
			
Ada.Text_IO.Put(Item =>"Bir Boolean  Nesnesinin Bellekte kaplayacağı bit Sayısı  : " & Integer'Image(İşaret_Bayrağı'Size));
			
endb3_1_1_uyg_11;

Bu programın sonucu :

Boolean  Veri Tipinin Bellekte kaplayacağı bit Sayısı  :       1

Bir Boolean  Nesnesinin Bellekte kaplayacağı bit Sayısı  :  8

olmaktadır.
		

Bu sonuçlardan, Boolean veri tipi için sadece 1 bit gerekli olmasına karşın bir Boolean veri tipinde nesnenin belleğe yerleştirilmesi için 8 bit (1Byte) gerekli olmaktadır. Bu veriler, düşük düzey çalışmaları yapacak programcılara yol gösterecektir. Ayrıca, bazı durumlarda, düşük düzey çalışmaları için, Size niteliğinin değiştirilmesi ve derleyicinin belirli veri tiplerinin nesneleri için yerleştireceği bellek alanı genişliğinin yeniden belirlenmesi olasılığı da bulunmaktadır.

Düşük düzey çalışmalaırı için her türlü araca sahip olmasına karşın, Ada programlama dilinde, özellikle C ve C++ gibi programalama dillerinde olduğu gibi, düşük düzey çalışmaları normalde gerekli olmayabilir. Ada programlama dilinde genel düşünce, programcıların amaçlarını, yüksek düzeyde iyi belirtmeleri durumunda, Ada derleyicisinin düşük düzey çalışmalarını, programcıya problem çıkarmadan kendi başına gerçekleştirebileceği şeklindedir. Ada programlam dilinin üstün taraflarından biri de budur. Ada derleyicisi de bu nedenle bilgisayar bilimleri açısından bir fenomen ve dünyanın en gelişkin derleyicisi olarak nitelendirilmektedir. bu nedenle de Ada programlama dili, dünyanın en gelişkin programlama dili olarak kabul edilmektedir. Düşük düzey çalışmaları, programcılar için çok zahmetli ve hata yapma olasılığı yüksek çalışmalardır. Bu çalışmalar soucunda, elde edilebilecek küçük performans artışları ve bellek tasarrufunun, bunu sağlamak için gerekli olacak programlama çabasına değip değmeyeceği düşünülerek düşük düzey çalışmalarına girişilmelidir. Ada programlama dili, programcılara, program amaçlarına ulaşabilmek için istediklerinde yüksek, istediklerinde daha düşük düzeyde çalışabilme olanağını sağlamaktadır. Fakat, üst düzey programlama teknikleri her zaman tercih edilmelidir.

Bu Bölümde, mantıksal (Boolean) veri tipine uygulanabilen nitelikleri incelemeye çalıştık. Yapılmış olan çalışmalarda özellikle prosedürlerin organizasyonu, değerlerin atanması, sonuçların görüntülenmesi konularında uygulamaların iyi incelenmesi ve özümsenmesi yararlı olacaktır.

Valid XHTML 1.1