Ada Programlama Dili Temelleri

Bölüm 4

Kullanıcı Tanımlı Veri Tipleri

Bölüm 4 Sayfa 1

4.1 Özgün Tiplerin Tanıtımı

Ada programlama dili, alışılagelmiş birçok programlama diilinin kapasitesini ve düşünce yeteniğini kat kat aşar. Ada, birçok programlama dilinin düşüncesinde olmayan, kullanıcı tipi verilerin yani kullanıcıların kendi gereksinmelerine göre tasarımını yaptıkları verilerin tanıtımına olanak sağlar.

Ada programlama dili, aslında Standard paketle temel (progenitor) tipleri kullanıma açar. Bu temel tipler, sadece ilk gereksinmeleri karşılamak ve temel tanımların yapılması amacını taşımaktadır. Programların taşınma yeteneğinin arttırılması ve verilerin amaca uygunluğu açısından kullanıcıların kendi tip ve alt tiplerini tanıtıp uygulamaları sağlık verilmektedir.

Örnek olarak karpuz sayımını gerçekleştirmek amacı ile yapılacak bir programda, karpuzların ayrık ve sayılabilir nitelikte olmaları, bunların bir tamsayı tipi ile sayılmaları gerektiğini gösterir. Karpuzlar negatif olamazlar, program, en çok 10000 karpuz sayımını hedeflerse, Karpuz veri tipinin 0 ile 10000 arası kısıtlı bir tamsayı alt tipi olması gerektiğini açıklar.

Standard pakette, sayılablir tipler, Boolean ve Character tipleri ile sınırlıdır. Oysaki kullanıcılar daha başka sayılabilir veri tiplerine, örnek olarak haftanın günleri veya yılın ayları gibi verileri toplayan sayılabilir verilere gereksinme duyabilirler. Yine Standard pakette yer almayan yeni veri tiplerinin tanıtımına gereksinme duyulabilir. Bunun için kullanıcıların kendi veri tiplerini tanıtıp kullanmaları gerekecektir.

Veri kategorileri Ada 2012 spesifikasyonu unda tanımlandığı şekilde aşağıda görülmektedir.

all types
   elementary
      scalar
         discrete
             enumeration
                character
                boolean
                other enumeration
             integer
                signed integer
                modular integer
         real
             floating point
             fixed point
                ordinary fixed point
                decimal fixed point
      access
         access-to-object
         access-to-subprogram
   composite
      untagged
         array
             string
             other array
         record
         task
         protected
      tagged (including interfaces)
         nonlimited  tagged record
          limited tagged
             limited tagged record
             synchronized tagged
                tagged task
                tagged protected

Kullanıcı tipi verilerin tanıtımı için sözdizimi,

type_declaration ::=  full_type_declaration
   | incomplete_type_declaration
   | private_type_declaration
   | private_extension_declaration

 

full_type_declaration ::= 
     type defining_identifier  [known_discriminant_part] is type_definition;
   | task_type_declaration
   | protected_type_declaration

 

type_definition ::= 
     enumeration_type_definition  | integer_type_definition
   | real_type_definition | array_type_definition
   | record_type_definition | access_type_definition
   | derived_type_definition | interface_type_definition

 

integer_type_definition ::= signed_integer_type_definition | modular_type_definition
signed_integer_type_definition ::= range static_simple_expression .. static_simple_expression
modular_type_definition ::= mod static_expression

 

real_type_definition ::=
floating_point_definition | fixed_point_definition
floating_point_definition ::= 
  digits static_expression  [real_range_specification]

Bu tanımlar, kullanıcı tanımlı veri tiplerinin yaratılması için uyulması gereken sözdizim kurallarıdır.

Ada programlama dili, verileri, veri sınıfları olarak sınıflandırır. Veri sınıfları, verilerin temel yapılarını belirler ve bu yapıya uygun veri tipleri, aynı veri sınıfının üyeleri olarak nitelendirir. Bazı veri sınıflarının temel tipleri de tanımlanmıştır. Temel tipler, derleyicinin tanımlayabildiği ve donanımın destekleyebildiği en geniş yeteneklere sahip tipler olarak düşünülür. Her veri sınfının öntanımlı işlemcileri ve uygulanılanabilir nitelikleri tanımlanmıştır.

Ada programlama dili, Ada 2012 spesifikasyonunda İşaretli Tamsayılar, İşaretsiz (Çevrimsel) (Modüler) Tamsayılar, Gerçek sayılar, Adi Sabit Ondalıklı Gerçek Sayılar, Desimal Sabit Ondalıklı Gerçek Sayılar, Sayılabilir Veriler, Diziler, Kayıt Tipi Veriler, Bellek Adresleri (Access) ve Görev (Task) tipi Veriler olmak üzere temel 12 tane veri sınıfını kullanıma açar. Kullanıcılar, Ada 2012 spesifikasyonu içinde tamımlı olan ve bir kısmı yukarıda görülen sözdizimi kuralları içerisinde bu veri sınıfları içinde kendi veri tiplerini tanıtıp kullanabilirler.

Bazı veri sınıfları, daha fazla ayrıştırılamayan Tamsayılar, Gerçek Sayılar, Sayılabilir Veriler, Bellek Referans Tipleri gibi basit (bölünemeyen) veri tipi sınıflarıdır. Dizi ve Kayıt Tipi veriler ise çeşitli sınıftan basit tiplerin biraraya getirilmesi ile oluşturulmuş bileşik veri sınıflarıdır.

Ada veri sınıfları hiyerarşik bir yapı oluşturur. Temel veri tipi öntanımlı ise en tepede öntanımlı temel veri tipi bulunur. Her yaratılan kullanıcı veri tipi bu temel tipin alt tipi sayılır ve her alt tipi istendiği kadar alt tipi tanımlanabilir. Her alt tip, üst tipinin tanımlı işlemcilerini kalıtım yolu ile elde eder. Öntanımlı temel tiplerin bulunmadığı veri sınıflarında, her kullanıcı tanımlı veri tipi temel tipin ilk alt tipi olarak düşünülebilir ve alt tipleri oluşturulabilir.

Ada veri sınıflarının temel tipleri, isimsiz ve soyut tanımlardır. Her isimsi veri tipi, temel tipin ilk alt tipi olarak kabul edilir ve istendiği kadar alt tipleri yaratılabilir.

Ada 2012 spesifikasyonunda Ada temel veri sınıfları ve bu sınıflara ait alt veri tiplerinin oluşturma yöntemleri belirlidir. Kullanıcılar hiçbir başka yardımcı paket içinde tanımlı metotlardan yararlanmaya gerek duymadan kendi alt veri tiplerini yaratabilir ve kullanabilirler. Bu açıdan Standard Pakette tanımlanmış veri tiplerine hiçbir gereksinme yoktur. Standard Paket kullanıcılara yardım amacı ile hazırlanmıştır. Kullanıcılar Standard Paketteki tanımları örnek alarak, kendi özgün veri tiplerini yaratıp kullanabilirler.

Bu bölüme kadar yaptığımız çalışmalarda, Tamsayı ve Gerçek SAyı sınıfı veri tiplerinin sadece Standard Pakette tanımlanmış olan öntanımlı tiplerini kullandık. Bu bölümde, Tamsayı ve Gerçek Sayı sınıfından kendi özgün tiplerimizi yaratıp kullanacağız.

Yukarıdaki listede görülen bazı veri tipleri henüz incelenmemiş veri tipleridir. Bunları da zamanla konular ilerledikçe, inceleyip uygulayacağız.

Her yeni bir birimin (entity) tanımı, bir ismi bu birimin görüntüsü (view) ile ilişkilendirir. Bir birimin görüntüsü, bu birimin tanınması ive kullanımı çin gerekli isim ve diğer ayraç ( discriminants) ve kısıtlar gibi tanımlamaları da içerir. Bir tipin görüntüsü (view of a type yerine) tip (type, ve subtype) terimleri kullanılır.

Bir programın derlenmesi sırasında bir tipin tanımı, o tipi tanımlar. Programın çalışma sürecinde (run-time) o tipin geliştirilmesi (elaboration) işlemi sonunda tanımlanmış olan tip yaratılmış olur.

Bir tip, temel kullanım sematiğini belirleyen değerler kümesi ve temel işlemlerini belirleyen işlemler kümesi ile karakterize edilir. Belirli bir tipin nesnesi (object), bu tipin değerini içeren bir çalışma süreci birimi (entity) dir.

Belirli bir tipin nesnelerinin alabilecekleri değerler, çeşitli kısıtlar (constraint) ile sınırlandırılabilir. Bu kısıtlar, kapsam kısıtları, indis (index) kısıtları, ayraç (diskriminant) kısıtları olabilir. Hiçbir kısıtın belirtilmediği durum boş kısıt (null constraint) olarak adlandırlır.

Yeni tanımlanan tipler, türetilmiş oldukları veri sınıfının tüm tanımlı işlemlerini de kalıtım yolu ile kazanırlar.

Ada programlama dilinde kullanıcıya özgü, özgün ve yeni tam ( full type) bir veri tipi

type Veri_Tipi is ... (tipin tanımı)
    

şeklinde tanımlanır. Bu tanım, tanımlanan veri tipinin yapısında kuramsal anonim İsimsiz) bir veri tipi kavramı oluşturur ve bu kavramın (konsept), Veri_Tipi isimli ilk alt tipini yaratır.

İlk olarak, tamsayılar sınıfından verilerin yataılmasını inceleyeceğiz. Tamsayılar sınıfı verilerin öntanımlı root_integer adlı bir temel bir tipi bulunmaktadır. Bu temel tipten sonra, universal_integer adlı tamsayı tipi tanımlanmıştır. Bunun alt tipi spesifikasyonda belirtilmememiştir. Kullanıcılar universal_integer den sonraki alt tamsayı sınıfı veri tipini oluşturmakta özgürdür. Standart Paket Integer adında bir tamsayı veri tipi tanımlamaktadır. Yine Standart Pakette, Integer veri tipinin Natural ve Positive alt tipleri tanıtılmaktadır. Standart Paket kullanıcı paketine eşdeğer bir pakettir. Kullanıcılar, yeni ve universal_integer veri tipi altında olacak tamsayılar sınfından yeni bir veri tipi yaratabilirler. Bu yeni veri tipi, öntanımlı Integer ve alt tiplerinden farklı olacaktır. Tüm type saklı sözcüğü ile tanıtılan yeni tipler başkaları ile aynı sınıftan olabilirler fakat farklı tip olarak kabul edilirler.

Tamsayılar sınıfından bu yeni veri tipi Ada sisteminin kökenlerini içeren Pascal sözdiziminde bir tanım şekli olan aşağıdaki tanımdır.

type Tamsayı is range -1E-18 .. 1E18 (tipin tanımı)
    

Her yeni temel tip, mutlaka type saklı sözcüğü kullanılarak ve sadece bir isim ve bir kapsam aralığı isteği belirtilerek yaratılır. Tanım sunumu type sözcüğü kullanılarak yapıldığından, Ada derleyicisi bu isteğin temel bir tip yaratılması amacı ile yapıldığını anlar. Yaratılacak yeni temel tipin veri tipini analiz eder, basit veya bileşik bir veri tipi olduğunu saptar, istenilen kapsam aralığını belirler. Kapsam aralığı statik yanı değeri derleme öncesi belirli olan değerler veya uygun durumlarda değerleri derleme sonucunda belirlenecek dinamik ifadelerle belirtilebilir. Bu kapsam aralığının donanımda desteklenip desteklenmediğini inceler ve herşeyin gerektiği gibi olduğunu belirlerlerse bu tipe ait temel bir tip kavramı oluşturur ve type tanımımında belirtilen isimle, bu tipin ilk alt tipini yaratır. Bu sürece geliştirme (elaboration) adı verilir.

Tanımında type saklı sözcüğü belirtilerek yaratılmış olan yeni veri tipi, kuramsal olarak, kuramsal bir veri tipinin kapsam alanı sınırlı ilk alt tipi olarak kabul edilir. Ada 2012 spesifikasyonu bunu yeni ve farklı bir tip olarak kabul eder ve T olarak tanımlar. Uygulama açısından ise, bu yeni tanımlanan veri tipi, yeni ve alt tipleri tanımlanabilir bir veri tipi olarak hareket eder. Bu yeni veri tipi kendi sınfının özelliklerini, aynı sınıftan diğer tipler ile paylaşır. Fakt aynı sınıftan olmasına karşın, aynı sınıftaki diğer veri tiplerinden faklıdır. Aynı sınıftaki diğer veri tipleri ile aynı ifadelerde bulunamaz, aynı sınıfta bile olsalar, diğer veri tipleri için tanımlanmış giriş/çıkış prosedürlerinden yararlanamaz. Sadece aynı sınıftaki, veya benzer yapıdaki snıflardakiveri tipleri ile açık olarak birbirlerine dönüştürülebilir. Bu veri tipininin nesnelerinin alabileceği değerler, tanımındaki kısıtlar ile belirlenir.

Bir alt tipin, kapsam kısıtlaması olmayan (null constraint) kuramsal üst tipine T'Base niteliği ile erişilir. T'Base niteliği, yaratılmış olan yeni tipin üst tipi niteliğinde olan kuramsal kısıtsız bir tipin niteliklerine erişim sağlar. Örnek olarak, Tamsayı'Base'First niteliğinin değeri, Tamsayılar sınıfında, bir verinin donanımda desteklenebilen en geniş kapsam aralığının ilk değerini, döndürür. Bu değer, tamsayılar kümesinin donanımda desteklenebilien ilk elemanının değeridir. Tamsayı'Base'Last niteliğinin değeri ise, Tamsayı yapısında bir verinin donanımda desteklenebilen en geniş kapsam aralığının son değerini, döndürür. Bu değer, tamsayılar kümesinin donanımda desteklenebilen son elemanının değeridir. Bu değerlere göre, donanımın desteleyebildiği değerler saptanarak, yeni özgün veri tipleri daha bilinçli, donanımın destekleyeceği kapsam aralığında ve derleyicinin onay vereceği şekilde tanımlanabilir.

Kuramsal olarak alt veri tipi olarak tanımlansa de, her type olarak tanımlanan veri tipi, özgün ve alt tipleri türetilebilir bir yeni veri tipl olarak hareket eder. Yeni veri tipleri belirli bir veri sınıfından olurlar ve önceden tanıtılmış hiçbir isimli tipten türeyecek şekilde tanımlanmazlar. Yeni veri tipleri sadece bir isim ve ve bir kapsam aralığı şeklinde type saklı sözcüğü ile tanıtılırlar. Yeni veri tipinin veri sınıfını derleyici saptar.

Birçok programlama dilinde sadece statik yani değeri derleme öncesinde belirli olacak şekilde tanımlanabilen tip kapsamları, Ada tanımlarında dinamik, yanı değeri derleme sırasında program adımlarına göre belirlenen değerler olabilir. Bazı durumlarda ise sadece statik değerler kullanılabilir. Kapsamları dinamik olarak tanımlanan veri tiplerinin tanımlarında, dinamik ifadelerin sonucu, o tipin tanımı için geçerli olan değerleri sağlamalıdır.

Tamsayı veri tipi gibi özgün bir veri tipin tanımı derleyici tarafından kabul edilirse, bu veri tipinin programlarda kullanılması için uygulama nesnelerinin yani, değişken ve sabitlerinin yaratılması gerekir.

Yeni tanımlanan veri tipleri, temel yapıları aynı bile olsa ayrı veri tipi olarak kabul edilir. Bu veri tipinden nesneler birbirlerine atanamaz ve ifadelerde karıştırılamazlar. Örnek olarak, Tamsayı ve Integer tamsayılar sınıfından birer veri tipidir fakat aynı tip değildir. Nesneleri birbirlerine atanamaz. Fakat gerek Tamsayı, gerekse Integer tamsayılar sınıfından birer veri tipi olduklarından tüm sayısal sınıftan veri tipleri gibi birbirlerine uyumludur ve açık (explicit) tip dönüştürümü ile birbirlerine atanabilirler. Yani,

A : Tamsayı := 7;
B : Integer := 26;
C : Integer;
...

C := Integer(A);
    

ataması geçerlidir. fakat, Tamsayı veri tipinin kapsam aralığı Integer tipinin kapsam aralığından fazladır. Açık tip dönüşümleri, kapsam sınırı kontrollü tip dönüşümleridir. Tamsayı veri tipinin nesnelerinin değeri, Integer veri tipinin nesnelerinin kapsam sınırını aşacak kadar yüksekse, açık tip dönüşümü sırasında kapsam aşımı hatası oluşur.

Tamsayı veri tipinin tamsayı kapsamı olağanüstü geniştir ve çalıştığımız sistemde desteklenebilmektedir. Çalıştığımız sistemde, desteklenebilecek en yüksek tamsayı kapsam aralığı aşağıda görülen prosedürde görüldüğü gibi, saptanabilmektedir.


with Ada.Text_IO;

procedure b4_1_uyg_1 is

   package Görüntü renames Ada.Text_IO;
   
   type Tamsayı is range -9E18 .. 9E18;
   
begin

   Görüntü.Put(Item => Tamsayı'Image((Tamsayı'Base'First)) & "  ..  " &  Tamsayı'Image((Tamsayı'Base'Last)));
   
end b4_1_uyg_1;

Bu prosedürün sonucu :  

-9223372036854775808  ..   9223372036854775807

olmaktadır.

    

Yukarıdaki prosedürde, görüldüğü gibi bu yeni tipin sağladığı tamsayı kapsam aralığı desteği inanılmaz genişliktedir. Dunya nufusununyaklaşık 1010 kişi olduğu düşünülürse, bu veri tipi ile tüm dünya insanlarına bir kimlik numarası verilebilir ve geride daha kullanılabilecek büyük sayıda kapasite kalır.

Yeni oluşturulan Tamsayı veri tipi yeni bir veri tipidir ve Integer veri tipi ile her iki veri tipinin nesnelerinin tamsayı değerleri olacağından başka bir ilgisi yoktur. Bu nedenle, öntanımlı Ada.Integer_Text_IO giriş/çıkış kolaylığı, Tamsayı veri tipi için kullanılamaz. Tamsayı veri tipinin görüntülenebilmesi için ya yukarıdaki prosedürde, yapılmış gibi, Tamsayı nesnelerinin sözel imajının alınmasını veya aşağıdaki prosedürde, görüldüğü gibi Tamsayı veri tipindeki nesnelerin standart ortamda giriş/çıkışlarını sağlayacak yeni bir paketin oluşturulması gerekir.

with Ada.Text_IO;

procedure b4_1_uyg_2 is

   type Tamsayı is range -9223372036854775808 .. 9223372036854775807;

   package Tamsayı_IO is new Ada.Text_IO.Integer_IO(num => Tamsayı);

begin

   Tamsayı_IO.Put(Item => Tamsayı'First , width => 20 );   

   Ada.Text_Io.Put( Item => "  ..  " );
  
   Tamsayı_IO.Put(Item => Tamsayı'Last , width => 20 );

end b4_1_uyg_2;

Bu prosedürün sonucu :  

-9223372036854775808  ..   9223372036854775807

olmaktadır.  

Bu şekilde, donanımın kapasitesinden tam olarak yararlanabilecek yeni veri tipleri yaratabilir ve uygulamalarımızda kullanabiliriz.

Yeni veri tipleri yaratabileceğimiz bir başka veri sinıfı da, Gerçek Sayılar veri sınfıdır. Bu sınıfın en ilk veri tipi, root_real, sonraki universal_real veri tipidir. Bu ndan sonra gelen veri Standard Pakette tanımlanmış olan Flaot ver tipidir, fakat bu nokta kendimiz yeni bir veri tipi yaratabiliriz. Yeni yaratılacak gerçek sayı veri tipi, gerçek sayılar sınfından olacak, ve universal_real den bir sonraki alt tip olacak fakat Float ile hiyerarşik ilişkisi (alt/üst) ilişkisi bulunmayacak, Flaot veri tipi ile farklı bir gerçeksayı veri tipi olacaktır. Float ile tek ilgisi, her ikisinin de gerçek sayılar sınıfından veri olmaları ve bu yüzden birbirleri ile uyumlu olduları ve birbirlerine açık dönüştürme ile dönüştürülebilir olmalarıdır.

Yeni gerçek sayı sınıfı veri tiplerinin yaratılması için yukarıdaki tanımda belirtilen sözdizimi kuralları uygulanır.

Burada, digits saklı sözcüğünü izleyen static expression, bir tamsayı değeri veya sonucu bir tamsayı olan herhangibir ifadedir.

Özgün bir gerçek sayı veri tipinin tanımında, gerçek sayı kapsam aralığının belirtilmesi, tanımdan da görülebileceği gibi isteğe bağlıdır. Eğer bir kapsam aralığı tanımlanacaksa, digits saklı sözcüğünü; izleyen static simple expression, .. static simple expression gerçek bir sayı değeri veya sonucu bir gerçek sayı değeri olan bir ifadededir. Her iki ifadenin de aynı gerçek sayı veri tipinde olması gerekli değildir.

Burada dikkat edilmesi gereken birçok nokta bulunmaktadır. Herşeyden önce öngörülen ondalık sayısının pozitif bir tamsayı olması ve System.Max_Base_Digits değerinden yüksek olmaması gerekir. Aynı şekilde, kapsam sınırının da desteklenebilen değerler arasında olması gerekir. Eğer ondalık sayısı ve kapsam aralığı tanımı bu koşullları sağlayamazsa, derleyici tanımı geçersiz sayar.

Eğer bir kapsam aralığı tanımı yapılmamamışsa, tanımlanan yeni veri tipi için güvenli kapsam aralığı, D tanımlanan ondalık sayısı olmak üzere, yaklaşık olarak, 10.0**(4*D) .. +10.0**(4*D) olarak belirtilmiştir. Geçerli güvenli işlem sınırları, Safe'First ve Safe'Last nitelik değerli ile belirlenir.

Eğer geçerli bir kapsam sınırı tanımlanmışsa, bu yeni tip kısıtlı (constrained), aksi halde kısıtsız (unconstrained) bir tip olarak tanımlanır. Kısıtsız veri tipleri için sadece taşma (overflow) kontrolleri yapılır ve hiçbir zaman sınır aşımı kontrolü yapılmaz. Doğal olarak sistemin olanak verdiğinden daha yüksek değerler verildiğinde, kapsam aşımı hatasının oluşumu kaçınılmaz olur.

Özgün gerçek sayı tiplerinin yaratılması için geçerli örnekler:

type Değer digits 18;

Burada, Değer adında duyarlığı 18 ondalık olan kısıtsız bir özgün gerçek sayı veri tipi yaratılıyor. Bu tanımla, Değer veri tipi, Gerçek Sayılar veri sınıfından bir veri tipi olarak tanımlanmış olmaktadır. Değer veri tipinin duyarlığı Long_Long_Float veri tipi ile aynıdır ve programlarda aynı görevi yapar.

İlginç ve çok yararlı bir örnek, http://en.wikibooks.org/wiki/Ada_Programming/Mathematical_calculations sayfasındaki iki gerçek sayının toplanması programında tanımlanmıştır. Bu örneği inceleyelim :

with Ada.Text_IO;

procedure Numeric1 is

type Value_Type is digits 12 range -999_999_999_999.0e999 .. 999_999_999_999.0e999;

package T_IO renames Ada.Text_IO;

package F_IO is new Ada.Text_IO.Float_IO(Value_Type);

Value_1 : Value_Type;

Value_2 : Value_Type;

begin

T_IO.Put ("First Value : ");

F_IO.Get (Value_1);

T_IO.Put ("Second Value : ");

F_IO.Get (Value_2);

F_IO.Put (Value_1);

T_IO.Put (" + ");

F_IO.Put (Value_2);

T_IO.Put (" = ");

F_IO.Put (Value_1 + Value_2);

end Numeric_1;
    

Bu programın sonucu :

First Value : 23.4567788

Second Value : -88.348561893

2.34567788000E+01 + -8.83485618930E+01 = -6.48917830930E+01

olmaktadır.

Aynı çalışmaları, 18 duyarlıklı olarak tanımlamak istediğimiz. Değer isimli gerçek sayı veri tipini, (Kuramsal olarak Gerçek Sayılar sınfından yeni bir veri tipi sınıfının ilk alt tipi) kullanarak yapmaya çalışalım. İlk yapmamız gereken şey, bu veri tipi ile çalışabileceğimiz gerçek kapsam aralığının saptanmasıdır. Bu bilgiyi, aşağıdaki prosedür ile alabiliyoruz.

with Ada.Text_IO;

procedure b4_1_uyg_3 is

   type Değer is digits 18;

begin

   Ada.Text_IO.Put(Item => Değer'Image(Değer'First) & " .. " &  Değer'Image(Değer'Last));

end b4_1_uyg_3;

Bu prosedürün sonucu :  

-1.18973149535723177E+4932 ..  1.18973149535723177E+4932

olmaktadır.
    

Yukarıdaki prosedür ile aldığımız Değer adlı, 18 duyarlık ondalıklı, gerçek sayı sınıfı veri tipinin kapsam alanı bilgisi yukarıdaki daha önce gördüğümüz 15 duyarlık ondalıklı veri tipinin yaklaşık yarısı kadar olabiliyor. Fakat, yine de çok etkileyici bir duyarlık sayısı için, çok etkileyici bir kapsam alanı genişliği elde edebiliyoruz. Bu kapsam alanını kullanarak, değer veri tipinin genişletilmiş ondalık sayısı ile Numeric_1 prosedürünün yeni bir çalışmasını yapalım.

with Ada.Text_IO;

procedure b4_1_uyg_4 is

   type Değer is digits 18 range -1.0E+4900 .. 1.0E+4900;
      
   package T_IO renames Ada.Text_IO;

   package F_IO is new Ada.Text_IO.Float_IO(Num => Değer);

   Değer_1 : Değer;

   Değer_2 : Değer;

begin

   T_IO.Put (Item => "İlk Değer : ");

   F_IO.Get (Item => Değer_1);

   T_IO.Put (Item => "İkinci Değer : ");

   F_IO.Get (Item => Değer_2);

   F_IO.Put (Item => Değer_1);

   T_IO.Put (Item => " + ");

   F_IO.Put (Item => Değer_2);

   T_IO.Put (Item => " = ");

   F_IO.Put (Item => Değer_1 + Değer_2);

end b4_1_uyg_4;

Bu prosedürün sonucu :  

 4.40000000000000000E-54 +  4.45000000000000000E-55 =  4.84500000000000000E-54

olmaktadır.
    

Gerçekten etkileyici bir programlama dili. Başka programlama dillerinde hep hazır veri tipleri seçilmek zorunda kalınır ve çoğunlukla bu hazır veri tiplerinin duyarlığı üzerinde kullanıcının ne bilgisi ne de bir kontrolü olabilir. Ada için durum farklı, kullanıcılar, gereksinmelerine göre istedikleri duyarlıkta veri tiplerini kendileri oluşturup kullanabiliyorlar. Kullanıcıları sadece desteklenen kapsam aralığı sınırlandırabiliyor. Bu olanak gerçekten sıra dışı ve kullanıcıya büyük avantaj sağlayan bir programlama dili özelliğidir. Ada'nın bu olanakları ile FORTRAN'a fark attığı yukarıdaki çalışmalarda belirtiliyor. Sonuçlara dikkat edilirse, girilen verideki ondalık sayısı tanımlanandan az ise, geri kalan ondalık değerlerine sıfır ekleniyor yani, ilgisiz değerler konulmuyor. Toplama sonucu da, aynı verilen ondalık değerleri ile gerçekleştiriliyor. Ayrıca makinenin algılayabildiği epsilon sayısı güvenli epsilon olarak belirtilen 10-D (en son programda 10-18) dan çok yukarıda ve veriler 10-50 civarındaki değerleri toplama ve çıkarmada algılayabiliyor. Gerçekten Ada ile sayısal işlem yapmak bir zevk haline geliyor.

Bu kısımda, daha önce incelemeiş olduğumuz veri sınıflarına ait yeni veri tiplerinin yaratılması ve uygulanması yapılmıştır. İleride daha fazla veri tipierini inceleyecek ve uygulayabileceğiz. Ada veri tipleri üzerindeki bilgilerimiz, Ada programlama dili üzerindeki bilgilerimiz geliştikçe artacaktır. Bu derslerin en sonunda Ada veri sistemini yeniden gözden geçirecek ve bu sistematiği daha bilgili olarak yeniden değerlendirme olanağını bulacağız.

4.2 Türetilmiş Tipler

Türetilmiş tipler (derived types) bir veri tipi sınfı kavramına uygun olarak oluşturulmuş aynı sınıf ailesinden yeni tipler anlamına gelir. Yukarıda yaratılmış olan Tamsayı tipi yeni bir tip veya kuramsal açıdan yeni bir tipin ilk alt tipi niteliğindedir. Tamsayı verisi bir tamsayı verisi olduğundan root_integer sınıfından gelme bir veri olarak kabul edilecek ve bu şekilde tamsayılar için tanımlı tüm nitelik ve işlemciler, tamsayı veri tipi için de geçerli olacaktır.

Veri tiplerinin sınıfları çok önemlidir. Veri tipleri temel tip en tepede olmak üzere hiyerarşik bir yapılanma oluşturur. Temel tipin işlemcileri tüm alt tipler tarafından paylaşılır. İstendiğinde her alt tip düzeyinde tanımlar yenilenebilir. Buna bindirme adı verilir. Örnek olarak Tamsayı veri tipi ailesinin en üst veri tipi root_integer veri tipi olduğu kabul edilir. bu ailede sırası ile universal_integer, Integer ve kenimizin tanımladığı Tamsayı veri tipi bulunur. Burada Tamsayı veri tipinden türetilmiş yeni bir veri tipi yine root_integer kısaca tamsayılar sınıfından yeni bir veri tipi olacaktır.

Aynı sınfına ait alt sınıflar birbirleri ile aynı veri yapısındadırlar. Bu nedenle birbirleri ile uyumludurlar ve birbirlerine dönüştürülebilirler. Hepsi aynı temel veri tipinden türetildiğinden, ana veri tipi için tanımlı işlemcileri kalıtımla elde ederler. Fakat bunlar farklı veri tipleri olarak kabul edilir ve ifadelerde birlikte kullanılamazlar.

Tamsayı veri tipinin donanımca desteklenebilen en geniş kapsam aralığına sahip olabilecek tamsayı veri tipi olarak tanımlandığı hatırlanmalıdır. Bazı uygulamalar, bu kadar geniş bir kapsam aralığına gereksinme duymayabilrler. Örnek olarak başka hiçbir öntanımlı tamsayı veri tipi ile erişilemeyecek 188 .. 109 kapsam aralığında tamsayıların bulunduğu bir kapsam alanında tamsayı değerlerinin tanımlanabildiği bir veri tipine gereksinme duyulursa, bu veri tipinin Tamsayı veri tipi yerine, her şeyi ile Tamsayı veri tipi olan, sadece kapsam aralığı daha dar olan yeni bir tamsayı veri tipi ile tanımlamak istenebilir. Bu durumda, Tamsayı veri tipi ailesinden yeni bir alt tip tanımlanabilir.

Bir tipten (aslında bir tipin ilk alt tipinden) yeni bir alt tip yaratmak için iki yöntem uygulanabilir. Bunlardan birisi, biran sonra göreceğimiz alt tip yaratılması, diğeri de burada inceleyeceğimiz bir türev tip yaratılmasıdır. Her ikisi de ana tipten farklı yeni bir alt tip yaratan bu iki yöntem sonunda, ana tipin ilk alt tipinden farklı ve ana tipin ikinci alt tipi olan yeni bir tip yaratılır. Yaratılan bu ikinci alt tip, ilk alt tipten farklı, ifadelerde birlikte kullanılmayan fakat ilk alt tiple uyumlu ve açık tip dönüşümü ile ilk alt tipe dönüştürülebilen, ilk alt tipin tanımlı tüm işlemcilerini kalıtımla elde eden bir yeni bir tip kabul edilir. Doğal olarak kalıtımla elde edilen işlemciler yeniden tanımlanarak salt yeni alt tip için geçerli işlemci tanımları da gerçekleştirilebilir. Yeni ikinci alt tipin standart ortamda giriş çıkışı, aynı ilk alt tipte olduğu gibi kendisinin sözel imajı alınarak, Ada.Text_IO öntanımlı paketinden yararlanılarak veya kendine özgü yeni bir giriş/çıkış paketi oluşturularak gerçekleştirilebilr.

Bir tipin ilk alt tipinden yeni bir alt tip türetimi aşağıdaki yöntemle oluşturulabilir:

derived_type_definition ::=
[abstract] [limited] new parent_subtype_indication [[and interface_list] record_extension_part]

Bu ana kadar olan bilgilerimiz türetilmiş bir alt tipin oluşturulması için

type Türetilmiş_Tip_Tanımlayıcısı  is new Türetilen_Tip_Tanımlayıcısı [range Kapsam_Alt_Değeri .. Kapsam_Üst_Değeri]
    

şeklinde tanımlar yapabilmemize olanak vermektedir. Örnek olarak,

type Bölge_Tanım_Numaraları is new Tamsayı range 1E8 .. 1E9;
    

şeklinde bir tanım, isimsiz bir tamsayı tipinin ilk alt tipi olan Tamsayı tipinden Bölge_Tanım_Numaraları adında yeni bir tipi türetmektedir. Türetilmiş olan Bölge_Tanım_Numaraları tipi, ana tipi olan Tamsayı tipi için tanımlı işlemcileri kalıtımla elde eder.

Yukarıdaki tanımda, kuramsal açıdan isimsiz bir tamsayı tipinin ilk alt tipi olan Tamsayı tipinden ikinci alt tip Bölge_Tanım_Numaraları tipi türetilmiş olarak belirtiliyorsa da, operasyonel, yani, uygulama açısından Tamsayı temel tip, Bölge_Tanım_Numaraları ilk türetilmiş alt tip olarak düşünülebilir. İster kuramsal, ister uygulama açısından düşünülmüş olsun, veri tipleri, türetilmiş veya alt tip olarak tanıtılmış tiplerin uygulaması değişmez.

Türetilmiş bir alt tip, türetidiği ana tipten daha dar veya ona eşit bir kapsam aralığına sahip olmalıdır. Bunun aksinde bir durum, alt tipten ana tipe dönüştürme durumunda, kapsam hatasına neden olur.

Aşağıda görülen prosedürde, özgün bir tipten, türetilmiş bir tipin tanıtımı ve uygulanması görülmektedir.


with Ada.Text_IO;

procedure b4_2_uyg_1 is

   type Tamsayı is range -9223372036854775808 .. 9223372036854775807;
   
   type Bölge_Tanım_Numaraları is new Tamsayı range 1E8 .. 1E9;
   
   Sektör_1_a_Dosya_18 : Bölge_Tanım_Numaraları := 1E8 + 1;
   
   package Bölge_Tanım_Numaraları_IO is new Ada.Text_IO.Integer_IO(num => Bölge_Tanım_Numaraları);
   
begin
   
   Ada.Text_IO.Put("Dosya Numarası : ");
   
   Bölge_Tanım_Numaraları_IO.Put(Item => Sektör_1_a_Dosya_18 , width => 20);
   
end b4_2_uyg_1;
   
   
   
Bu prosedürün sonucu :  

Dosya Numarası :            100000001

olmaktadır.  

Yukarıdaki prosedürde, Bölge_Tanım_Numaraları veri tipinin Tamsayı veri tipinde türetilmiş bir tip olmasına karşın, ne Integer, ne de türetildiği Tamsayı veri tipi ile aynı olmadığı görülmektedir. Bu nedenle, Bölge_Tanım_Numaraları veri tipinin nesnelerinin görüntülenmesi için, yeni bir griş/çıkış paketinin oluşturulması gerekmiştir. Integer, Tamsayı ve ondan türetilen Bölge_Tanım_Numaraları veri tipleri aynı olmamakla birlikte birbirleri ile uyumludur ve nesneleri açık dönüşüm yöntemi ile birbirlerine dönüştürülebilirler.

Bir veri tipinden kapsam aralığı bile aynı olabilen farklı isimli yeni veri tiplerinin niçin yaratma gereği olabileceği ilk bakışta düşündürücü gelebilir. Fakat, türetilmiş veri tipleri aynı veri sınfından bile olsalar farklı veri tipleri olarak kabul edilirler ve ifadelrde birbirleri ile karıştırılamazlar. Bu nedenle, örnek olarak Elmalar ve Armutlar gibi ayrık ve tamsayılarla toplanabilen veriler, işlemlerde yanlışlıkla karıştırılmamaları için, değişik isimli tamsayı veri tipleri ile tanımlanmaları istenebilir.

4.3 - Alt Tipler

Bir ana veri tipine dayalı olarak alt veri tipi oluşturmak için uygulanabilecek yöntemlerden birisi biraz önce incelemiş olduğumuz türetilmiş (derived) sınıfların oluşturulması, diğeri ise, burada inceleyeceğimiz alt tiplerin (subtype) yaratılmasıdır. İlk yöntem, ana sınıfın yapısında, ana sınıf ile uyumlu fakat ana sınıftan tamamen farklı bir veri tipi yaratmasına karşın, alt tip (subtype) yaratılması, yapısı yine ana tip ile aynı, belki ana tipe göre bazı ek kısıtlamaları olabilen, fakat ana tip ile aynı olarak kabul edilen bir veri tipi oluşturur.

Bir veri tipi sınfının alt tipi, veri tipinin bazı değerlerinin, kısıtlarının ve alt tip için uygulanabilir bazı niteliklerinin belirlendiği bir veri tipidir. Temel tip, alt tipin tipi olarak adlandırılır. Alt tipin tanımı sırasında belirtilmiş olan kısıtlar, alt tipin kısıtları olarak belirtilir. Alt tipin değerleri, kendi kısıtlarını sağlayabilen değerlerdir.

Bir alt tip, kendine özgü kısıtlar (constraints) belirtilerek tanımlanabilir. Bu durumda kısıtsız bir alt tip (unconstrained subtype) oluşur. Bir tip bazı kısıtlar içerebilir fakat, bu tipin alt tipi hiç kısıtsız tanımlanabilir. Bu durumda kısıtsız (unconstrained) bir alt tip oluşur.

Alt tipler, yeni ve farklı bir veri tipi olarak değil, tanımlanmış olan veri tipinin aynı ve devamı olarak kabul edilirler. Alt tipler, ifadelerde birlikte kullanılabilirler. Doğal olarak, temel tip için tanımlı olan işlemciler, alt tipler için de tanımlı kabul edilir. Alt tipler, ana tiplerinden farklı olarak kabul edilmezler ve bu şekilde, ana tip için tanımlı olan giriş/çıkış prosedürlerinden alt tipler de yararlanabilirler.

Alt tiplerin tanımı,

subtype_declaration ::= subtype defining_identifier is subtype_indication;
subtype_indication ::= [null_exclusion] subtype_mark [constraint]
subtype_mark ::= subtype_name
constraint ::= scalar_constraint | composite_constraint
scalar_constraint ::= range_constraint | digits_constraint | delta_constraint
composite_constraint ::= index_constraint | discriminant_constraint

olarak tanımlanır. kısıtlar içeren bir alt tip tanımı, kısıtlı bir alt tip, aksi halde kısıtsız (unconstrained) bir alt tip yaratır.

Örnek olarak,

Subtype Aday_Sayısı is Integer range 0 .. 100;
    

kısıtlı bir tamsayı alt tipi yaratır. Aşağıdaki tanım ise,

Subtype Toplam_Sayı is Integer;
    

kısıtsız bir tamsayı alt tipi yaratır. Her iki alt tip ise temel tipleri olan öntanımlı Integer veri tipi ile aynı olarak kabul edilir.

Aşağıda görülen prosedürde, kullanıcı tipi bir gerçek sayı veri tipinden bir gerçek sayı alt tipi yaratılmakta ve bir ifadede kullanılarak, ifade sonucu görüntülenmektedir.

with Ada.Text_IO;

with Ada.Long_Long_Float_Text_IO;

procedure b4_3_uyg_1 is

    subtype İlk_Değer is Long_Long_Float range -1.0E-30 .. 1.0E30;

    İkinci_Değer : Long_Long_Float range -1.0E-30 .. 1.0E10 := 4.6E-5;
   
    package LFGÇ renames Ada.Long_Long_Float_Text_IO;

    a : İlk_Değer := 2.6E-8;
   
    b , c : İlk_Değer;
   
    Sonuç :  Long_Long_Float range 4.62E-6 .. 4.622E-6;
   

begin

    b := 2.89;
   
    c := 28.78;

    sonuç := a * b / c + İkinci_Değer * b / c;
  
    LFGÇ.Put(Item => Sonuç , Fore => 1 , Aft => 18 , Exp => 2);

end b4_3_uyg_1;

Bu prosedürün sonucu :  

4.621790826963168870E-6

olmaktadır.  

Yukarıdaki prosedürde, üzerinde durulması gereken çok önemli noktalar bulunmaktadır. İlk olarak, İlk_değer adında bir Long_Long_Float alt tipi yaratılmıştır. Bu alat tipin ana tipten tek farkı kapsam alanının daha dar olmasıdır. Bazı durumlarda bir tipin duyarlığı gerekebilir fakat gereksinme duyulan kapsam alanı daha dar olabilir. Bu durum da böyle bir kısıtlı kapsam alanına gereksinme duyulan bir değişkenine gereksinme duyulan bir prosedürü belirtmektedir. Burada kapsam alanının gereksinme olduğu kadarı ile sınırlı tutulması, bu alt tipten nesnelere uygun olmayan verilerin girilmesi durumunda, derhal kapsam aşımı hatasının ortaya çıkması amacını taşımaktadır.

Üzerinde durulması gereken ikinci konu,

    İkinci_Değer : Long_Long_Float range -1.0E-30 .. 1.0E10 := 4.6E-5;
    

şeklinde yapılmış olan ve subtype tanımı yapılmadan bir alt tip olarak tanıtılmış olan İkinci_değer, sadece tek değerlik bir alt tip olarak değerlendirilir ve alabileceği tek değeri de başlangıçta almış olduğundan program içinde sadece değeri değiştirilebilir. İkinci_Değer, bir alt tip sınıfı olarak değerlendirilmez ve alt tipleri ile başka nesneleri tanımlanamaz. Bu durumdai İkinci_Değer, tek değerlik bir alt tip nesnesi olarak düşünülebilir. Eğer program içinde değeri değiştirilmeyecekse, yani sadece ilk değeri ile program içinde bir tür sabit gibi kullanılacaksa, İkinci_Değer , Long_Long_Float tipinden bir sabit veya başlangıç değeri tanımlı bir değişken olarak da tanıtılabilirdir ve bu belki daha doğru olurdu, çünkü bu tür tür tek değerlik bir alt tip tanıtımının tek amacı Sonuç değişkeninde olduğu gibi, program içinde bu tek nesnelik alt tipin teke nesnesinin alabileceği değerin, kapsam sınırı dışında kalması durumunda, kapsam aşımı hatasının derhal alınmasıdır. Sonuç değişkeninin bu kadar dar kapsam aralığında tanımlanması sadece veri güvenliğinin sağlanması amacına yöneliktir.

Yine yukarıdaki prosedürden görüldüğü gibi tüm alt tipler ayrı bir tip olarak değil hep aynı Long_Long_Float veri tipi olarak kabul edilmektedir ve Long_Long_Float veri tipi için tanımlı işlemci ve giriş/çıkış paketlerini paylaşmaktadır. Tüm ana ve subtype olarak tanıtılmış alt veri tipleri ana tiple birlikte ifadelerde kullanılabilmektedir.

İlginç bir alt tip oluşturma yöntemi de isimsiz (anonim , sanskrit kökenli) alt tipin tanımlanmasıdır. İsimsiz bir alt tipin ana sınıfı ve kısıtları belirli fakat alt tip ismi yoktur. İsimsiz alt tipler, değişken veya sabitlerin (kısaca nesnelerin) tanımlan sırasında oluşturulurlar. . Aşağıda görülen prosedürde, isimsiz alt tiplerin tanımı yapılmıştır.

with Ada.Text_IO;

with Ada.Integer_Text_IO;

procedure b4_3_uyg_2 is

   İsim : String (1..5) := "Hasan";
   
   Güvenlik_Kodu : Integer range 0 .. 10_000 := 1_4_23;
   
begin

   Ada.Text_IO.Put(Item =>"Çalışanın Adı : " & İsim & "  ,  Güvenlik Kodu  :  ");
   
   Ada.Integer_Text_IO.Put(Item => Güvenlik_Kodu , width => 4);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put("Bilgilendirme Tamam.");
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put("Erişim Sonu.");
   
end b4_3_uyg_2;

Bu prosedürün sonucu :  

Çalışanın Adı : Hasan  ,  Güvenlik Kodu  :  1423

Bilgilendirme Tamam.

Erişim Sonu.

olmaktadır.
    

Yukarıdaki prosedürde, iki tane isimsiz alt tip tanımı yapılmaktadır. Bunlardan biri bir isimsiz dizi (karakter dizisi) olan İsim nesnesinin ait olduğu adı verilmemiş, 5 karakterden oluşan bir karakter dizisidir. Ada programlama dilinde String tipi veriler, olmalaraı gerektiği gibi karakter dizisi (character array) olarak değerlendirilir. İsimsiz veri tipinin sahip olabileceği tek nesne olan İsim nesnesine öntanım olarak "Hasan" değeri atanmıştır. Bu değer, program içinde değiştirilmeden kullanılmaktadır.

Yukarıdaki prosedürde, tanımı yapılmış olan ikinci isimsiz alt veri tipi, Güvenlik_Kodu olarak tanımlanmış nesnenin veri tipi olan, öntanımlı Integer veri tipinin alt tipi olan isimsiz bir veri tipidir. Bu isimsiz veri tipinin de sahip olabileceği tek nesne olan İsim değişkenine, ön değer olarak 1_4_23 değeri atanmış ve bu değer program içinde değiştirilmememiştir.

Yukarıdaki prosedürde görüldüğü gibi, isimsiz alt veri tipleriin nesnleri oluşturulamamakta ve bunlar tanımlandıkları tek nesne ile sınırlı kalmaktadırlar. Bu durumda isimsiz (anonim) alt tipler gerçek alt tip veri sınıfı olarak nitelendirilemezler. Bu veri tiplerinden neneler oluşturulamaz ve bunların alt tipleri tanımlanamaz çünkü çağrılabilecekleri bir tip isimleri yoktur. Bu nedenle de, Ada Kalite ve Stil yönergesi kullanıclara isimsiz alt tiplerin kullanılmamasıni sağlık vermektedir. Aslında isimsiz alt veri tiplerinin tanımlanmasına gerek de bulunmamaktadır. En doğru yöntem, önce alt tipin tanımlanması sonra da bu alt tipin nesnelerinin oluşturulması olacaktır. Örnek olarak, yukarıdaki prosedürde, Güvenilk_Kodu nesnesi, isimsiz bir veri tipinin nesnesi olarak tanımlanacağına,

subtype Kod is Integer range 1 .. 10_000;
Güvenlik_Kodu : Kod := 1_4_23;
    

şeklinde önce isimli alt tipin, sonra da bu alt tipin nesnesinin tanımının çok daha uygun bir kodlama stili olacağı, Ada Kalite ve Stil yönergesi tarafından sağlık verilmektedir. Aşağıda görülen prosedürde, isimsiz olarak tanımlanan alt veri tipleri, isimli tam alt tipler olarak tanımlandıktan sonra, bu alt tiplerin gereken nesneleri yaratılarak program tamamlanmıştır.

with Ada.Text_IO;

with Ada.Integer_Text_IO;

procedure b4_3_uyg_3 is

   subtype Çalışan_İsmi is String( 1..5); 

   İsim : Çalışan_İsmi := "Hasan";
   
   subtype Kod is Integer range 1 .. 10_000;
   
   Güvenlik_Kodu : Kod := 1_4_23;
   
begin

   Ada.Text_IO.Put(Item =>"Çalışanın Adı : " & İsim & "  ,  Güvenlik Kodu  :  ");
   
   Ada.Integer_Text_IO.Put(Item => Güvenlik_Kodu , width => 4);
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put("Bilgilendirme Tamam.");
   
   Ada.Text_IO.New_Line;
   
   Ada.Text_IO.Put("Erişim Sonu.");
   
end b4_3_uyg_3;

Bu prosedürün sonucu :  

Çalışanın Adı : Hasan  ,  Güvenlik Kodu  :  1423

Bilgilendirme Tamam.

Erişim Sonu.

olmaktadır.
    

4.4 - Tiplerin Birbirlerine Dönüştürülmesi

İfadelerde veri tekdüzeliğinin sağlanabilmesi için bazı durumlarda, açık (explicit) tip dönüştürülmesine gerek duyulur. Tip dönüştürme işlemi aşağıdaki gibi yürütülür:

type_conversion ::= subtype_mark(expression) | subtype_mark(name)

Bu tanımda subtype_mark olarak belirtilen terim, tip dönüşümünde hedefi belirten terimdir. Parantez içindeki ifade veya isim kısmı, işlenen kısmıdır, bu kısmın veri tipine işlenen veri tipi adı verilir. Tip dönüşümünün gerçekleşmesi için hedef ve işlenen tiplerinin birbirlerine dönüştürülebilir olmaları gerekir.

Eğer tip dönüştürme işleminin işleneni isim ise, bu işleme görüntü dönüştürümü (view conversion) adı verilir. Bu tip bir işlem az uygulanır ve sadece işlenen etiketli bir kayıt (record) tipi ise veya bir prosedürünün in veya in out argümanı ise gerçekleşir. Diğer tüm tip tip dönüşümleri değer dönüşümleridir.

Etiketsiz bir tipin dönüştürümünde dönüştürülecek tipin aynen geriye dönüştürülebilir olması gerekir.

Değer dönüşümü şeklinde yürütülen bir tip dönüşümünde, işlenenin değeri, eğer varsa hedef veri tipi türünde bir değere dönüştürülür. Eğer böyle bir değer yoksa kapsam aşımı hatası oluşur. bu da sadece modüler bir tipin kapsamı dışında kalan bir değer oluşumunda gerçekleşir.

Eğer hedef ve işlenen veri tipleri tamsayılar sınıfında ise , aynı tamsayı değeri, tipler arasında iletilir.

Eğer hedef ve işlenen veri tipleri desimal sabit ondalıklı veriler sınıfında ise, işlenenin değeri, hedef tipin small değerinin katları arasında değilse, 0 a doğru kesilir.

Eğer hedef ve işlenen veri tipleri farklı gerçek sayı veri tiplerinde ise, sonuç hedef tipin duyarlığı düzeyindedir.

Eğer işlenen veri tipi bir gerçek sayı, hedef bir tamsayı veri tipi ise, sonuç en yakın tamsayıya indirgenir. Eğer sonuç iki tamsayının tam ortasında ise, sonuç sıfıra en uzak olan değere yuvarlanır.

Eğer hedef ve işlenen veri tipleri sayılabilir veri tipinde iseler, sonuç işlenen ile aynı konum sayısında olan hedef veri tipinde elemanın değeri olur.

Diğer veri tipleri incelenirken veri bu veri tiplerinin kendi aralarında ve başka veri tiplerine doğru değer dönüştürüm kuralları üzerinde de ayrıca durulacaktır.

Aşağıda görülen prosedürde Bir gerçek sayı veri tipindeki değer, bir tamsayı tipine dönüştürülmektedir.

with Ada.Text_IO;

with Ada.Integer_Text_IO;

procedure b4_4_uyg_1 is

   type Gerçek_Sayı_Verisi is new Float range 1.0 .. 20.0;
   
   a , b  : Gerçek_Sayı_Verisi;
   
   c : Integer;
   
begin

   a:= 19.0;

   b := 2.0;
   
   c := Integer(a/b);
   
   Ada.Text_IO.Put(Item => "Sonuç : ");
   
   Ada.Integer_Text_IO.Put(Item => c);

end b4_4_uyg_1;

Bu prosedürün sonucu :  

Sonuç :          10

olmaktadır.
    

Sonucun sıfırdan uzağa yuvarlatıllmış olduğuna dikkat edilmelidir.

Genel olarak programcılara açık ve açık olmayan tip dönüşümlerinden olanaklar ölçüsünde kaçınmaları sağlık verilmektedir. Bunun nedenleri arasında, en basit veri dönüştürmelerinde bile veri kayıpları yaşanabileceği ve bu kayıpların gözden kaçabileceği, ayarıca veri tipleri karmaşıklaştıkça açık dönüştürüm kurallarının da içinden çıkılamayacak kadar karmaşık hale gelmesi gösterilmektedir. Genel olarak, açık dönüştürmenin sadece gerektiğinde ve sadece sayısal veri sınıfları arasında gerçekleştirilmesi sağlık verilmektedir. Yine de karar vermek programcıya bağlıdır. Programın yürüyüşünde istenmeyen bir yan etki gözlenmediği durumlarda, açık tip veri dönüştürmeleri, programı kısaltıcı ve okunmasını kolaylaştırıcı bir yöntem olabilir.