Absolute (votka değil!)

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

Absolute direktifi bir değişkenin kendisinden önce tanımlanmış bir başka değişken ile aynı hafıza bloğunu kullanmasını sağlar.

var
  iValue : Cardinal;
  iOther : Cardinal absolute iValue;
begin
 iValue := 250;
 ShowMessage(InttoStr(iValue) + ‘-’ + InttoStr(iOther)); // 250-250

 iOther := 555;
 ShowMessage(InttoStr(iValue) + ‘-’ + InttoStr(iOther)); // 555-555
end;

Yukarıda görüldüğü üzere iki değişken de aynı hafıza bölgesini paylaşıyorlar ve birinde yapılan değişiklik diğerine otomatikman yansıyor.Ancak absolute direktifini gösterdiği tip ile aynı tipte vermeyebilirsiniz.Şöyle ki:

var
  iValue : Cardinal;
  iOther : Byte absolute iValue;
begin
  iValue := 255;
  ShowMessage(InttoStr(iValue) + ‘-’ + InttoStr(iOther));
 
  iValue := 555;
  ShowMessage(InttoStr(iValue) + ‘-’ + InttoStr(iOther));

  iOther := 0;
  ShowMessage(InttoStr(iValue) + ‘-’ + InttoStr(iOther));
end;

Yukarıdaki örnekte durumun biraz değiştiğini görüyoruz. Birinci değişken olan iValue Cardinal olarak tanımlanmış yani 4 Byte(32 bit) ve ona işaret eden iOther değişkeni Byte(8 bit) olarak tanımlanmış.Bu tanımlama da iOther değişkeni herzaman iValue değişkeninin ilk byte’ını gösterecektir.İlk byte’ının içerisinde ne değer varsa o değeri yansıtır. iOther üzerinde yaptığınız değişiklik ise iValue değişkeninin birinci byte’ını değiştirecektir.

Peki şimdi gelin daha ilginç bir kullanıma yakından bakalım.

type
  TBytes = record
    Bytes : array[1..4] of Byte;
end;

var
  iValue : Cardinal;
  ByteArray : TBytes absolute iValue;
begin
  iValue := 255;
  ShowMessage(InttoStr(ByteArray.Bytes[1])); // 255
  ShowMessage(InttoStr(ByteArray.Bytes[2])); // 0
  ShowMessage(InttoStr(ByteArray.Bytes[3])); // 0
  ShowMessage(InttoStr(ByteArray.Bytes[4])); // 0

  ByteArray.Bytes[1] := 0;
  ByteArray.Bytes[2] := 0;
  ByteArray.Bytes[3] := 0;
  ByteArray.Bytes[4] := 255;
{
  İkilik gösterimde:

  11111111 00000000 00000000 00000000
}
 
  ShowMessage(InttoStr(iValue)); // 4.278.190.080
end;

Bu ilginç yapıda 4 Byte uzunluğa sahip olan Cardinal değişkeninin tek tek byte’larını hiç bir hamle yapmadan, ekstra kod çabası gerektirmeden elde etmiş olduk.Programınızın herhangi bir yerinde iValue üzerinde yapılacak olan değişiklik otomatikman ByteArray’i etkileyecektir.ByteArray’de yaptığınız bir değişiklik de aynı şekilde iValue değişkeninin değerini etkileyecektir. Matematiksel hesaplamalarla yakinen ilgilenen, grafik programlama da byte byte işlem yapan programcı arkadaşlarımızın sanırım ilgisini çekecektir bu yapı.

Saygılar, sevgiler..

Yorum Yazın