• Sonuç bulunamadı

PDP 5 Veri Tipleri. İlkel tipler, çoğu programlama dilinde yer alan ve diğer tiplerden oluşmamış veri tiplerini göstermektedir.

N/A
N/A
Protected

Academic year: 2022

Share "PDP 5 Veri Tipleri. İlkel tipler, çoğu programlama dilinde yer alan ve diğer tiplerden oluşmamış veri tiplerini göstermektedir."

Copied!
11
0
0

Yükleniyor.... (view fulltext now)

Tam metin

(1)

1

PDP 5 Veri Tipleri

2

Veri tipi

(data type) bir değerler/nesneler kümesini ve bu nesneler üzerindeki bir takım ön tanımlı işlemlerini (predefined operations) tanımlar.

Bir

betimleyici/tanımlayıcı (descriptor) bir değişkenin (variable)

özelliklerinin (attributes) koleksiyonudur.

Bir programlama dilindeki veri tipleri, programlardaki ifade yeteneğini,

gerçek hayattaki problemlere nasıl uygulanacagını programların güvenilirliğini doğrudan etkiledikleri için, bir programlama dilinin değerlendirilmesinde önemli bir yer tutarlar.

3

Bir problemin çözümü esnasında bilgisayarda tutulan, CPU komutu olmayan her türlü bilgiye veri denir.

Von Neumann mimarisi CPU ile belleği belirgin bir şekilde ayırır.

Bellek içeriği oldukça karışıktır. Bellekte:

Her türlü CPU komutları: yazmaç (register), bellek transferleri, aritmetik işlemler, karşılaştırma, vs.

Bazı işlemleri yapabilmek için ek bilgi: transfer etmek için adresler, vs.

İşlenecek değerler, adres bilgileri gibi veriler (data).

Belleğe erişim tamamen adrese göredir.

Von Neumann makinesinde işlenecek bütün bilgiler ikili (binary) sayısal sisteme dönüştürülmek zorundadır.

5

İlkel Veri Tipleri (Primitive) Karakter , katar Tipleri (Character, String ) Kullanıcı-tanımlı Sıra Tipleri (Ordinal)

Dizi Tipleri (Array)

İlişkili (Çağrışımlı) Diziler (Associative Arrays) Kayıt (Tutanak) Tipleri (Record)

Bileşim Tipleri (Union)

İşaretçi Tipleri (Pointer)

6

İlkel tipler, çoğu programlama dilinde yer alan ve diğer tiplerden oluşmamış veri tiplerini göstermektedir.

Bileşik Tipler Çeşitli veri tiplerinde olabilen bileşenlerden

oluşmuştur.

(2)

7

Integer

Genellikle her zaman donanımın tam yansımasıdır , bu yüzden eşlenme (mapping) önemsizdir

Bir dilde en çok sekiz farklı integer tipi olabilir

En bilinen temel veri tipi tamsayı (integer) dır. Bir tamsayı değer, bellekte en sol bit işaret biti olmak üzere bir dizi ikili (bit) ile gösterilir.

Temel tamsayı veri tipine ek olarak Ada ve C programlama dillerinde, short int,

int,

long int gibi üç ayrı büyüklükte tamsayı tipi tanımlanmıştır.

C'de işaretsiz tamsayı (unsigned int) veri tipi de bulunmaktadır.

8 TÜR İSMİ UZUNLUK (byte)

(DOS / UNIX) SINIR DEĞERLERİ

signed char 1 -128 127

unsigned char 1 0 255

signed short int 2 -32.768 32.767

unsigned short int 2 0 65.535

signed int 2 4 -32.768

-2.147.483.648 32.767 2.147.483.647

unsigned int 2 4 0

0 65.535

4.294.967.296

long int 4 -2.147.483.648 2.147.483.647

unsigned long int 4 0 4.294.967.296

9

Kayan Noktalı sayılar (Floating Point)

Gerçel (real) sayıları modeller Sadece yaklaşık olarak (pi , e vb)

kesirler ve üsler olarak iki bölümde ifade edilirler.

duyarlılık (precision) ve alan (range) açısından tanımlanırlar.

Duyarlılık, değerin kesir bölümünün tamlığıdır.

Alan ise, kesirlerin ve üslerin birleşmesidir.

Bilimsel kullanım için olan diller en az iki kayan-nokta tipini destekler

10

Kayan Noktalı sayılar

IEEE Kayan Nokta Formatları (IEEE Floating-Point Standard 754 ) Kayan noktalı sayılar, kesir (fraction) ve üst (exponent) olarak iki bölümde ifade edilirler.

kayan noktalı veri tipi, gerçel (real) ve çift-duyarlılık (double) olmak üzere iki tiple gösterilebilirler.

11

Complex

Bazı dillerde mevcuttur C99, Fortran, Python …

7 + 3j her değer gerçel ve sanal olmak üzere iki parçadan oluşur

12

Onlu / Ondalık (Decimal , BCD)

Onlu veri tipi, ondalık noktanın sabit bir yerde bulunduğu sabit sayıda onlu basamak içeren bir veri tipidir.

Bu veri tipi, az sayıda programlama dilinde (Örneğin; PL/I) tanımlanmıştır.

Onlu veri tipi, onlu değerleri tam olarak saklayabilirse de, üsler bulunmadığı için gösterilebilecek değer alanı sınırlıdır. Her basamak için bir sekizli (byte) gerekli olması nedeniyle, belleği etkin olarak kullanmaz. Ticari uygulamalar için (para)

Sabit sayıda ondalık basamak (decimal digits) saklar (kodlanmış) Avantaj: doğruluk (accuracy)

Dezavantaj: sınırlı aralık, belleği gereksiz harcar

(3)

13

Boolean (Mantıksal)

Mantıksal veri tipi,

ilk olarak ALGOL 60 tarafından tanıtılmış ve daha sonra çoğu programlama dilinde yer almıştır.

sadece doğru (true) veya yanlış (false) şeklinde ifade edilen iki değer alabilir.

bellekte bir ikili ile gösterilebilirse de, çoğu bilgisayarda bellekteki tek bir ikiliye etkin olarak erişim güç olduğu için, bir sekizlide (byte) saklanırlar.

Avantaj: okunabilirlik

14

Boolean

İlişkisel işlemciler, ve seçimli deyimler gibi programlamadaki birçok yapı, mantıksal tipte bir ifade üzerinde çalıştığı için mantıksal veri tipinin dilde yer almasının önemi büyüktür.

ALGOL 60'dan sonraki çoğu dilde yer alan mantıksal veri tipinin yer almadığı bir programlama dili C dilidir.

C'de ilişkisel işlemciler, ifadenin sonucu doğru ise 1, değilse 0 değeri döndürürler. C'de if deyimi, sıfır değeri için yanlış bölümünü, diğer durumlarda ise doğru bölümünü işler.

15

Karakter (Character) Tipleri

Karakter veri tipi, tek bir karakterlik bilgi saklayabilen ve bilgisayarlarda sayısal kodlamalar olarak saklanan bir veri tipidir.

Karakter veri tipinde en yaygın olarak kullanılan kodlamalardan biri ASCII kodlamasıdır. ASCII kodlaması, 128 farklı karakteri göstermek için, 0..127 arasındaki tamsayı değerleri kullanır.

ASCII kodlamasıyla bağlantılı olarak bazı programlama dilleri, karakter veri tipindeki değerlerle tamsayı tipi arasında ilişki kurarlar.

16

Alternatif, 16-bit kodlama: Unicode

Tüm doğal dillerin karakterlerini barındırır.

Burada karakterler 1-4 bayt ile gösterilirler.

Java, C# ve JavaScript de Unicode u destekliyor

Not:

C'de char ve int veri tipleri dönüşümlü olarak kullanılabilmektedir.

6-17 17

Karakter Dizgi Tipi (Character String Types)

Değerler karakterlerden (Character) oluşan sıradır

Bir karakter dizgi veri tipinde, nesneler karakterler dizisi olarak bulunur.

Tasarım problemleri:

Karakter dizgi veri tipi bazı programlama dillerinde temel bir veri tipi olarak (dolayısıyla dizilim tipi indeksli kullanım yok), bazılarında ise özel bir karakter dizilimi olarak yer almıştır.

Önemli tasarım özelliklerinden birisi de boyunun statik veya dinamik mi olmasıdır.

1. Bu bir ilkel (primitive) tip midir yoksa sadece bir çeşit özel dizi midir (array)?

2. Nesnelerin uzunluğu statik mi yoksa dinamik midir?

18

Karakter Dizgi Tipi

Bir karakter dizgi veri tipinde, nesneler karakterler dizisi olarak bulunur.

Karakter dizgi veri tipi bazı programlama dillerinde ilkel bir veri tipi olarak, bazılarında ise özel bir karakter dizisi olarak yer almıştır.

FORTRAN77, FORTRAN90 ve BASIC'te karakter dizgiler ilkel bir veri tipidir ve karakter dizgilerin atanması, karşılaştırılması vb. işlemler için işlemciler sağlanmıştır.

Pascal, C, C++ ve Ada'da ise karakter dizgi veri tipi, tek karakterlerden oluşan diziler şeklinde saklanır.

(4)

19

Karakter Dizgi Tipi C and C++

İlkel değildir

char dizileri kullanılır ve işlemler için kütüphane fonksiyonları vardır (strcpy(src,dst)).

SNOBOL4 (bir string işleme dili) İlkel veri tipidir. Birçok işlem hazır vardır.

JavaString sınıfıyla ilkeldir.

statik dizgi nesneleri yaratır. Nesneler değiştirilemez.

StringBuffer sınıfı değiştirilebilir dizgi nesnelerinin sınıfıdır.

Ada, FORTRAN 90, and BASIC Temel veri.

Atama, karşılaştırma, birleştirme, alt dizgiye erişim

FORTRAN da örüntülü eşleme var.

Perl, JavaScript, C++, C#

Patterns düzenli ifadeler (regular expressions) ile tanımlanır. Çok güçlü bir özellik Örneğin : /[A-Za-z][A-Za-z\d]+/ veya /\d+\.?\d*|\.\d+/

6-20 20

Karakter String Tipleri

İşlemler:

Atama , tanımlama (char *str = “özellikler”; ) (Assignment) Karşılaştırma (Kıyaslama)(Comparison) (=, >, strcmp , etc.) Birleştirme (Catenation)

Alt dizgiye erişim / Altstring referansı (Substring reference) Örüntülü eşleme (Pattern matching)

6-21 21

Örnekler:

Pascal

İlkel değildir ; sadece atama ve karşılaştırma (paketlenmiş diziler için) Ada, FORTRAN 90, ve BASIC

Biraz ilkel

Atama, kıyaslama (comparison), birleştirme (zincirleme)(catenation), altstring referansı (substring reference) FORTRAN desen eşleme (pattern matching) sahiptir

AdaN := N1 & N2 (bireştirme) N(2..4) (alt string)

6-22 22

C ve C++

İlkel(primitive) değildir

char dizileri ve işlemleri sağlayan bir fonksiyonlar kütüphanesi kullanır

SNOBOL4 (bir string işeleme dili)

İlkel

Birçok işlem, ayrıntılı desen eşleme(pattern matching) de içerir

6-23 23

Perl ve JavaScript

Desenler(Patterns) düzenli ifadeler şeklinde tanımlanır (regular expressions)

Çok güçlü bir özellik örn.,

/[A-Za-z][A-Za-z\d]+/

Java - String sınıfı (char dizileri değil)

Nesneler değiştirilemez (sabit(immutable))

StringBuffer , değiştirilebilir string nesneleri için bir sınıftır

24

Karakter Dizgilerin Uzunlukları Gerçekleştirim / Implementasyon:

1. StaticUzunluk- FORTRAN 77, Ada, COBOL derleme-süresi betimleyici

örn. (FORTRAN 90) CHARACTER (LEN = 15) NAME;

2. Sınırlı Dinamik Uzunluk C ve C++ mutlak uzunluk bir null karakter ile gösterilir

(Limited dynamic length) uzunluk için bir yürütme-süresi betimleyicisine (run-time descriptor) ihtiyaç duyabilir (C ve C++ da değil)

3. Dinamik uzunluk SNOBOL4, Perl, JavaScript

yürütme süresi betimleyicisine (run-time descriptor) ihtiyaç duyar;

ayırma/serbest bırakma (allocation/deallocation) en büyük implementasyon problemidir

(5)

6-25 25

Değerlendirme

Yazılabilirliğe yardımcıdır

Statik uzunluklu (Static length) bir ilkel(primitive) tip olarak, temin edilmesi ucuz--neden kullanmayalım ?

Dinamik uzunluk (Dynamic length) iyidir, fakat masrafa değer mi?

6-26 26

Statik stringler için

derleme-süresi tanımı Sınırlı dinamik stringler için yürütme-süresi tanımı

27

Bir sıralı (ordinal) tip, olası değerlerin pozitif tamsayılar kümesi ile ilişkilendirilebildiği veri tipidir.

Sayılama (enumeration)

Altalan (subrange) olmak üzere iki tür sıralı tip tanımlayabilir.

28

Sayılama (enumeration) tipi, gerçek hayattaki verilerin tamsayı (integer) veri tipine eşleştirilmesi için kullanılan veri tipidir.

Tasarım Problemi: Bir sembolik sabitin (symbolic constant) birden fazla tip tanımlaması içinde yer almasına izin verilmeli midir?

Bir sayılama tip tanımı, parantezler arasında yazılmış belirli sayıdaki isimden oluşur.

Java dilinde sayılama veri tipi bulunmamaktadır, fakat Enumeration arabirimini (interface) sağlar

Ada, C# ve Java 5.0; C++ dan daha iyi sayma tipi desteği verir.

29

C++:

enum renkler {kirmizi, mavi, yesil, sari, siyah};

C typedef enum {kirmizi, mavi, yesil, sari, siyah} renkler;

ADA type gunler is (Pazartesi, Salı, Çarsamba, Persembe, Cuma, Cumartesi, Pazar) Bu tanımlamaya göre “Pazartesi” bilgisi 1 sayısı ile ve “Pazar”bilgisi 7 sayısı ile eşleştirilmiş olur.

PASCAL

type renkbilgisi=(kırmızı, mavi, yeşil, sarı); var renk:renkbilgisi;

renk:=mavi;if renk > red; …….

30

Değerlendirme (enumeration tipleri için):

Okunabilirliğe yardım

Bir rengi bir sayı olarak kodlamaya gerek yoktur Güvenilirliğe yardım

derleyici şunları kontrol edebilir : i. İşlemler (renk eklenmesine izin vermez)

ii. değerlerin aralıkları (ranges of values) (eğer 7 renk izin verir ve onları 1..7, diye integers olarak kodlarsa bu durumda 9 bir legal integer olacaktır ve bu yüzden bir legal renk olacaktır)

İşlemleri (renklerin toplanması izin vermez) Tanımlandığı aralık dığında değerler atanamaz

(6)

31

Altaralık / Altalan(Subrange)

Tipi

Bir sıralı tipin (ordinal type) , sıralı bir bitişik altdizisi Ana sınıfa uygulanabilen tüm işlemciler, altalan tiplerine de uygulanabilmektedir.

Hem programlama dillerinin okunabilirliğine hem de güvenilirliğine olumlu katkı

Tasarım Problemi: Nasıl kullanılabilirler?

Pascal’da: type pos = 0 .. MAXINT;

32

Örnekler:

Pascal - Subrange tipleri kendi ebeveyn tipleri (parent types) gibi davranır;

for değişkenleri(variables) ve dizi indisleri(array indices) olarak kullanılabilir

örn. type pos = 0 .. MAXINT;

Ada – Alttipler yeni tipler değildir, sadece kısıtlı varolan tiplerdir;

Pascal’daki gibi, artı case sabitleri(constants) kullanılabilir subtype POS_TYPE is INTEGER range 0..INTEGER'LAST;

6-33 33

Subrange tiplerin değerlendirmesi:

Okunabilirliğe yardım

Güvenilirlik; kısıtlanmış aralıklar hata saptama sağlar

Kullanıcı-tanımlı sıralı tiplerin gerçekleştirimi

Enumeration tipleri integerlar olarak oluşturulur

Aralık tipleri, subrange değişkenlerine atamaları sınırlamak için (derleyici tarafından) kod yerleştirilmiş ebeveyn tipleridir

Aralık tipleri derleyici tarafından bazı şartlar eklenerek ebeveyn tip gibi gerçekleştirilirler.

6-34 34

Bir

dizi, homojen veri elemanların bir kümesidir, elemanlardan

her biri kümedeki birinci elemana göre olan pozisyonuyla tanımlanır.

Programlarda dizilere erişim, dizi ismi ve indis değeri şeklinde gerçekleştirilir.

35

Tasarım Problemleri:

1. indisler (indeks)(subscripts) için hangi tipler legaldir?

2. Eleman referansları aralığındaki indisleme ifadeleri kontrol edilmiş midir?

3. indis aralıkları ne zaman bağlanır (bounding)?

4. Ayırma (allocation) ne zaman olur?

5. indislerin (subscripts) maksimum sayısı nedir?

6. Dizi (array) nesneleri (objects) başlatılabilir mi (initialize)?

7. Herhangi bir çeşit kesite(slice) izin verilmiş midir?

36

İndeksleme (Dizin oluşturma)

indislerden elementlere eşleştirme (mapping) yapmaktır

map(array_name, index_value_list)  an element

Bütün dillerde genel önce dizinin adı sonra parantezler veya köşeli parantezler gelir, bunların arasında da index bulunur.

İndeks Sentaksı

FORTRAN, PL/I, Ada parentezler kullanır Diğer dillerin çoğu köşeli parantez [ ] kullanır

(7)

37

Index Tipleri

FORTRAN, C, Java – sadece “integer”

Pascal Her türlü sıralı tip (integer, boolean, char, enum) Ada integer veya enum (boolean ve char dahil)

Indexler C tabanlı dillerde 0’dan başlar. Fortran’da 1 dir. Bazı dillerde ise tamamen programcı tarafından belirlenir.

Aralık kontrolü

C, C++, Perl, ve Fortran aralık kontrolünü belirtmez.

Java, ML, C# aralık kontrolünü belirtir.

İndisin Üst Sınırı:

Popüler olan programlama dillerinde dizi indislerinin sayısı sınırlanmaz.

C'de ise diğer programlama dillerinden farklı bir tasarım vardır. C'de dizilerin tek indisi olabilir. Ancak, dizilerin elemanları diziler olabildiği için çok boyutlu diziler oluşturulabilir.

(int mat [2][3];)

6-38 38

İndisin Alt Sınırı:

C ve C++'da tüm indisler için alt sınır varsayılan olarak sıfır, FORTRAN 77 ve FORTRAN 90'da ise varsayılan olarak bir kabul edilir. Çoğu programlama dilinde ise, indislerin alt sınır değerleri dizinin tanımında belirtilmelidir.

43

indislerin (subscripts) sayısı

FORTRAN I en çok 3’e kadar izin verir FORTRAN 77 en çok 7’ye kadar izin verir Diğerleri – sınır yoktur

Dizi Başlatma (Array Initialization)

Genellikle sadece diziye, dizi elemanlarınmın bellekte saklandığı sıra ile sıralanmış olarak konulan değerlerin listesi

44

Dizi başlatma (array initialization) :

FORTRAN - DATA ifadesini kullanır, veya değerleri tanımda / ... / içine koyar C ve C++ - Kıvrık parantezler içinde, derleyici elemanları sayar ve buna göre yer ayarlar:

int sayilar [] = {2, 4, 6, 8};

char isim[] = “tugrul”; // karakter string char *isimler[] = {“ali”, “veli”} //String dizi (array) Java

String[] isimler = [“ali”, “veli”]; //String nesneleri Ada

List : array (1..5) of Integer := (1 => 17, 3 => 34, others => 0);

Pascal dizi başlatmaya izin vermez

45

Kesitler (slices)

Dizininin bir kısım altyapısıdır (substructure) ; bir referanslama mekanizmasıdır

Sadece dizi işlemleri olan diller için kullanışlıdır

FORTRAN 90 INTEGER MAT (1:4, 1:4) MAT(1:4, 1) ilk sütun MAT(2, 1:4) ikinci satır FORTRAN 95

Integer, Dimension (3, 3, 4) :: Cube Ada sadece tek-boyutlu diziler LIST(4..10)

6-45

46

Dizilerin İmplementasyonu

Erişim fonksiyonları (Access function) indis ifadelerini dizideki bir adrese eşler (map) Satıra göre veya sütuna göre sıralanır

Erişim fonksiyonu indexleri hesaplayarak dizinin içindeki hücrenin bellekte durduğu adrese ulaşır. Bunu yaparken

Sütün öncelikli (Fortran) veya

Satır öncelikli (Diğer diller) yöntemini kullanır.

Alt indis sınırı 1 ve her bir elemanının sözcük uzunluğu c olan bir dizinin A[k]’nci elemanın adresi:

Adres(A[k])=adres(A[1])+(k-1)*c Adres(A[k])={adres(A[1])-c}+k*c

(8)

47 Derleme Zamanı Tanımlamaları (Compile-Time Descriptors)

48

Bir ilişkili dizi (associative array), anahtar (key) adı verilen eşit sayıda değerlerle indekslenmiş veri elemanlarının sırasız bir koleksiyonudur

Bir ilişkili dizi kendisiyle aynı sayıdaki anahtar denilen değerlerle indekslenmiş rasgele verilerdir.

Anahtar değerlerinden bir hash algoritması ile değerler bulunur.

Tasarım Problemleri:

1. Elemanlara referansın şekli nedir?

2. Boyut statik midir yoksa dinamik mi?

49

Perl’de Yapı(Structure) ve İşlemler (Operations)

Değişken isimleri “%” ile başlar. Değişken boyu değişkendir.

Değerler parantezler arasına yazılır:

%YuksekSicakliklar = (“Pazartesi” => 45, “Salı” => 49,…);

Indexleme parantezler ve anahtar verilerle yapılır:

$YuksekSicakliklar{“Çarşamba”} = 42;

Elemanlar delete ile silinebilir:

delete $ YuksekSicakliklar{“Salı”};

Diziyi tamamen boşaltmak için:

@YuksekSıcakliklar = ();

50 import java.util.Hashtable;

import java.util.Enumeration;

...// create a new Hashtable

Hashtable h = new Hashtable( 149 /* capacity */, 0.75f /* loadfactor */ );

// add some key/value pairs to the Hashtable h.put( "WA" , "Washington" );

h.put( "NY" , "New York" );

h.put( "RI" , "Rhode Island" );

h.put( "BC" , "British Columbia" );

// look up a key in the Hashtable String key = "NY";

String stateName = (String)h.get( key );

System.out.println( stateName );

// prints "New York"

// enumerate all the contents of the hashtable Enumeration keys = h.keys();

while ( keys.hasMoreElements() ) {key = (String)keys.nextElement();

stateName = (String)h.get( key );

System.out.println( key + " " + stateName );

// prints lines of the form NY New York // in effectively random order.

} // end while

51

Bir kayıt (record) heterojen yapıdaki verilerin birleştirilmiş halidir. Her elemanın kendi tipi ve adı vardır.

Tasarım problemleri:

Referansların şekli nedir?

Hangi birim işlemler tanımlanmıştır?

Alanlara erişim sözdizimsel olarak nasıl yapılacak?

Kayıt(Record) Tanımlama Sentaksı

COBOL içiçe(nested) kayıtları(records) göstermek için düzey(level) sayılar kullanır; diğerleri özyineli(recursive) tanım kullanır

Kayıt Alanı Referansları(Record Field References) 1. COBOL

field_name OF record_name_1 OF ... OF record_name_n 2. Diğerleri (nokta gösterimi - dot notation)

record_name_1.record_name_2. ... record_name_n.field_name

54

Bir kayıt için bir derleme zamanı betimleyicisi (compile-time descriptor)

Her kayıt alanı için, kayıtın başlangıcına göre offset adresleri ilişkilendirilir

(9)

55

İlk olarak COBOL'da tanıtılmıştır.

Altalan olarak isimlendirilen birden fazla ifadenin bulunduğu yapıdır. Kayıt veri tipi ile bir isim altında farklı tipte birden fazla alan tanımlanabilir.

Yani dizilerde homojen elemanlar bulunurken kayıtlarda heterojen elemanlar vardır.

Dizideki bir elemana indis numarası ile ulaşılırken kayıt veri tipinde alanlara her sahayı gösteren tanımlayıcılarla (mus.ad) ulaşılmaktadır.

Kayıt içerisinde tanımlanan her alanın birbirinden farklı isimleri vardır.

İstenirse bu isimler bu tipin dışında farklı tanımlamalar için de kullanılabilir.

56

Kayıtlar ve Dizilerin Kıyaslanması

1. Dizi elemanlarına erişim kayıt alanlarına erişimden daha yavaştır, çünkü indisler dinamiktir alan adları statiktir

2. Dinamik indisler kayıt alanına erişimle kullanılabilirdi, fakat o zaman tip kontrolüne izin vermeyecekti ve çok daha yavaş olacaktı

57 Pascal dilinde kayıt veri tipi aşağıdaki söz dizim ile tanımlanır.

KayıtTipAdı=RECORD AlanAdı1:TipAdı;

AlanAdı2;TipAdı;

End;

6-58 58

Bir

bileşim, değişkenlerinin yürütme süresi sırasında farklı

zamanlarda farklı tipteki değerleri tutmasına izin verildiği tiptir Tasarim problemleri :

1. Eğer varsa hangi tip tip kontrolü yapılmalıdır?

2. Bileşimle kayıtlar ile entegre edilmeli midir?

59

Aynı bellek bölgesinin farklı değişkenler tarafından kullanılmasını sağlayan veri tipidir.

Bu veri tipindeki değişkenlere ortak değişkenler de denir.

Buradaki temel amaç farklı zamanlarda kullanılacak birden fazla değişken için ayrı ayrı yer ayırma zorunluluğunun ortadan kaldırılarak belleğin iyi kullanılmasıdır.

61

üç şekil(shape) değişkeninin(variable) bir discriminated bileşimi(union)

(10)

62

Union ların Değerlendirilmesi

Potansiyel olarak güvensiz yapılardır.

Tip kontrolüne izin vermezler.

Günümüzde programlama dillerinde güvenlik önemlidir. Java and C#

union desteklemez.

66

Bir küme değişkenlerinin bazı sıralı tiplerin ayrık değerlerinin sıralı olmayan koleksiyonlarını tutabildiği tiptir

Tasarım Problemi:

Herhangi bir set tipinde maksimum eleman sayısı nedir

6-66 Kodlar =set of

[0..255];

Harf =set of [‘A’..’Z’];

Rakam =set of [0..9];

kesişim * Birleşim + fark işlemler -

mantıksal operatörler (=, <> , <= , >=, in)

67

İşaretçi tipi, belirli bir veriyi içermek yerine başka bir veriye başvuru amacıyla kullanılır. Bir gösterge tipi sadece bellek adreslerinden oluşan değerler ve boş (null) değerini içerebilen bir tiptir.

Gösterge tipindeki değerler, gösterdikleri veriden bağımsız olarak sabit bir büyüklüktedirler ve genellikle tek bir bellek yerine sığarlar.

Bu yüzden işaretçilerin kullanımıyla bellek kullanımı ve yönetimi daha etkin hale gelmektedir. Liste, ikili ağaç ve dizi gibi veri yapıları işaretçilerle daha kolay kullanılabilir.

70

Atama işlemi j = *ptr

71

Pascal: sadece dinamik bellek yönetimi için kullanılır

Explicit dereferencing(postfix ^)

Askıdaki İşaretçiler (Dangling Pointers) olabilir (dispose) Askıda nesneler (Dangling objects) de olabilir

Ada: Pascal’dan biraz daha iyidir

Bazı askıdaki işaretçilere(dangling pointers) izin verilmez çünkü dinamik nesneler işaretçinin(pointer) tip kapsamının(type scope ) sonunda otomatik olarak serbest bırakılır(deallocated) Bütün işaretçiler(Pointers) null değerine başlatılır(initialize) Benzer askıda nesne(dangling object) problemi (fakat nadiren olur, çünkübelirtik serbest bırakma(explicit deallocation) nadiren yapılır)

72

C ve C++

Dinamik Bellek Yönetimi ve adresleme için kullanılır Explicit dereferencing ve address-of operatorü

Tanım Kümesi Tipi (Domain type) sabit olmak zorunda değildir (void *) void * herhengi bir tipe işaret edebilir ve tip kontrolü yapılabilir (dereference yapılamaz)

Adres aritmetiğini sınırlı biçimlerde yapabilir, örn.:

float stuff[100];

float *p;

p = stuff;

*(p+5) eşittir stuff[5] ve p[5]

*(p+i) eşittir stuff[i] ve p[i]

(Implicit scaling)

(11)

73

FORTRAN 90

heap ve non-heap değişkenleri gösterebilir Implicit dereferencing

İşaretçiler sadece TARGET özelliğine sahip olan değişkenleri gösterebilir TARGET özelliği tanımlama sırasında atanır:

INTEGER, TARGET :: NODE

non-dereferenced referanslar için özel bir atama operatörü kullanılır, REAL, POINTER :: ptr (POINTER bir özelliktir)

ptr => target (target ya bir pointer veya TARGET özelliğine) sahip bir non pointer olabilir)

Bu ptr yi target ile aynı değere ayarlar

74

C++ Referans tipleri

Ötrük (Implicit) olarak dereference edilmiş sabit işaretçiler (constant pointers)

Parametreler için kullanılır

pass-by-reference ve pass-by-value nin ikisinin de avantajları

Java – sadece referanslar

pointer aritmetiği yoktur

Sadece nesneleri gösterir (hepsi heap üzerinde)

Belirtik serbest bırakma (explicit deallocator) yoktur (Garbage collection kullanılır)

Askıda referanslar olamayacağı anlamına gelir Dereferencing her zaman örtüktür

75

İşaretçilerin değerlendirilmesi:

1. Askıda İşaretçiler (Dangling Pointers) ve Askıda Nesneler (dangling objects) problemlerdir, heap yönetiminde olduğu gibi

2. İşaretçiler goto‘lar gibidir, bir değişkenin erişebileceği hücreler(cells) aralığını (range) genişletirler

3. İşaretçiler veya referanslar dinamik veri yapıları için gereklidir ,bu yüzden onlar olmadan bir dil tasarlayamayız

76

İşaretçi Veri Tipinin Sorunları

Bir işaretçi değişkenini gösterebileceği veri tipi kısıtlanmazsa güvenlik sorunu oluşabilir. (gösterge kullanımlarında durağan tip denetimi yapılamadığı için) PL/I

Bir işaretçi değişkeninin gösterdiği adreste geçerli bir veri olmayabilir. (Pascal, C, C++)

GÜVENİLİRLİK tehlikeye girebilir.

C'de bir gösterge değişken tanımlanırken, adresini tutabileceği değişken tipi de belirtilmelidir (int *a;)

Java pointer kullanımına izin vermez.

78

#include <stdio.h>

void main() {

int a=4, b=7; //int tipinde a ve b değişkenleri tanımlanmış ve 4 ve 7 değerleri atanmıştır.

int *pa,*pb; // pa ve pb adında, yine int tipinde iki işaretçi değişken tanımlanmıştır printf("a=%d , b=%d\n",a,b); // a = 4 , b = 7 olarak ekrana yazdırır.

pa=&a; //a değişkeninin adresini pa işaretçi değişkenine ata pb=&b; //b değişkeninin adresini pb işaretçi değişkenine ata

*pa=*pa+10; // pa’nin işaret ettikleri değere 10 değerini ekler

*pb=*pb+10; // pb’nin işaret ettikleri değere 10 değerini ekler printf("a=%d, b=%d",a,b);

}

Burada *pa=*pa+10; *pb=*pb+10; ifadelerinde pa ve pb nin işaret ettikleri değerlere sırasıyla 10 değerini ekler. pa işaretçi değişkeni a değişkenine ve pb işaretçi değişkeni ise b değişkenini işaret ettiğine göre aslında değeri artırılan değişkenler a ve b dir. Bu programın ekran çıktısı

a = 4 , b = 7 a = 14 , b = 17 olur.

Referanslar

Benzer Belgeler

• Basit veri tipleri: sayısal, karakter, Boolean. • Kullanıcı-tanımlı sıralama ve

Şirket, Veri Sahibi’ne ait kişisel verileri işbu Gizlilik Politikası ile belirlenen amaçların gerçekleştirilebilmesi için Şirket’imize hizmet sunan yurtiçi ve yurtdışında

Çeş itli veri türlerine sahip değ iş kenleri yapı ile kontrol etme Yapı sal veri tanı mlanabilen bir dilde iş aretçi oluş turma Kayı t yapı sı nda bir değ iş ken tanı

Appletviewer veya html programları kullanarak: Java applet program kodu hazırlanarak html olarak kaydedilir, komut satırından “appletviewer program adı.html” komutu ile

HVAC pazarının yeni markası VENTAS'ın ürün portföyünde; hijyenik klima santralleri, konfor klima santralleri, yüksek verimli ısı geri kazanımlı havalandırma

Büyük verinin sunduğu bilgi hazinesinden ya- rarlanmak, algoritmaları kontrol ederek görünürlüğü artırmak, paylaşım ve sosyal medya akışını belirleyerek internette daha

Python programlama dilinde atama operatörler değişkenlere değer atanması sağlayan sembollerdir. Karşılaştırma operatörlerinin işletilmesi sonucunda python programlama dili True

Java dilinde String veri tipini sayısal veri tiplerinden herhangi birine ( Byte, Double, Float, Integer, Long, Short) dönüştürmek için parse deyimi kullanılır..