Record’lar sadece gruplanmış verileri tutmaya mı yarar..!

// 15 Mayıs 2009 // Delphi, Programlama

Uzun zaman önce delphi.zaxaz.com zamanında Sadettin POLAT’ın sitesine yazmış olduğum makalelerimi kendi sitemde de yayınlamak istiyorum. Yeni makalelerime başlamadan evvel malum biraz alıştırma yapmak gerekiyor :)

Genelde evet ancak Record’lar ile Parse işlemleri de yapılabilir. Şöyle düşünelim kayıt deseni sabit olan bir dosyanız olsun.Örneğin:

Adı Soyadı(14 karakter) + Yasi(2 karakter) + Doğum Tarihi(10 Karakter) olan bir dosya yapısına sahip olduğumuzu düşünelim. Bu gibi bir durumda bu dosya içerisinden verileri okurken Copy fonksiyonu ile istediğimiz alanların başlangıç ve bitiş noktalarını bildiğimiz için verileri elde ederiz. Ama gelin biz bunun için record yapısından istifade edelim.(Tabii burada verileri untyped record olarak save edebilir ve bir record’un içerisine otomatik de okuyabilirsiniz ama ben size daha az bilinen bir yolu göstermeye çalışacağım.)

TBolParcalaYonet = record
	AdiSoyadi 	: array[0..13] of Char;
	Yasi      	: array[0..01] of Char;
	DogumTarihi : array[0..09] of Char;
end;

var
	myStr : String;
	myRec : TBolParcalaYonet;
begin
	myStr := 'Tuğrul HELVACI3110.03.1975';
	myRec:= TBolParcalaYonet(myStr);

	ShowMessage(myRec.AdiSoyadi); // Tuğrul HELVACI
	ShowMessahe(myRec.Yasi); // 31
	ShowMessage(myRec.DogumTarihi); // 10.03.1975
end;


Görüldüğü üzere bir string ifade bir record’a cast edilerek parçalara ayrılabilmiştir.

Bir diğer ilginç kullanım alanı ise sayılarda ortaya çıkmaktadır..Herhangi bir sayısal veritipi üzerinde byte byte işlem yapmak istediğinizde yine imdadınıza recordlar yetişiyor.Elbette pek çok farklı alternatif var shr, shl gibi, ancak bu seferki konumuz record’lar..

Diyelim ki bir word değişkenimiz var ve word değişkenler hafızada 2 byte yer kaplarlar.Yani 16 adet bitten oluşurlar ve hepinizinde malumudur ki bitler içerisinde 0 ve 1 sayılarından başka bir değer tutamazlar. Matematiksel olarak ikili sayı sistemine göre 16 adet bitin (işaretli değil ise) tutabileceği maksimum değer 65.535 dir.(2 üzeri 16-1)

Bir byte’ın tutabileceği değer ise (2 üzeri 8 – 1) yani 255′dir. Şimdi recordumuzu aşağıdaki şekilde yazalım.

TByteRec = record
	Lo : Byte;
	Hi : Byte;
end;

var
	myWordValue : Word;
begin
	TByteRec(myWordValue).Lo := 255; // Bir byte’ın alabileceği maksimum değer.
	TByteRec(myWordValue).Hi := 255;
	ShowMessage(InttoStr(myWordValue)); // Ekranda 65.535 değerini gösterir.
end;

Geri kalan denemeler size bırakılmıştır. Daha iyi anlayabilmek için word’ün 2 byte olduğunu ve her byte’ın 8 bitten oluştuğunu unutmayınız. Ve size yardımcı bir uygulama olarak Windows’un hesap makinasını önerebilirim. Hesap makinasında bilimsel görünümü açıp İkilik sayı sistemini seçer ve 16 adet 1 basar, ardından da decimal görünüm seçerseniz karşınıza 65.535 rakkamı çıkacaktır. ;)

Saygılar, sevgiler..

“Record’lar sadece gruplanmış verileri tutmaya mı yarar..!” için 1 Yorum

  1. Mehmet Fatih Karabacak diyor ki:

    İyi çalışmalar dilerim. Yukarıda verdiğiniz örneği Delphi2007 ve Delphi XE de denedim. İkisindede “Invalid Type Cast” hatası aldım.
    Acaba unuttuğum bir şey mi var?

Yorum Yazın