Dinamik hafıza dizilerinde anlamadığım bir konu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
aligel54
Üye
Mesajlar: 41
Kayıt: 20 Nis 2009 11:34

Dinamik hafıza dizilerinde anlamadığım bir konu

Mesaj gönderen aligel54 »

Aşağıdaki kodda pointer değişken kullanımında anlamadığım bir konu var.

Kod: Tümünü seç

type
  PKayitItem = ^TKayitItem;
  TKayitItem = record
    a,b:Integer;
  end;
var
  Liste:TList;
  Kayit:PKayitItem;
begin
  Liste := TList.Create;
  New(Kayit);
  Kayit^.a := 5;
  Kayit.b := 3;
  Liste.Add(Kayit);
end;
Kayit^.a := 5; satırında noktadan önce ^ (üs) işareti kullandığımda da
Kayit.b := 3; satırında olduğu gibi kullanmadığımda da aynı şey oluyor.

Burada ^ işareti kullanmanın amacı nedir.
Kullanmazsam ne gibi sıkıntılar ortaya çıkar.

Şu ana kadar hep kullanıyordum. Fakat gereksiz ise boşuna kod yazmayı yavaşlatmaya gerek yok diye düşünüyorum.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2356
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Re: Dinamik hafıza dizilerinde anlamadığım bir konu

Mesaj gönderen freeman35 »

Tip tanımlamalarını incele. cem yılmazın, hikayesine dönmüş senin kod, ahçı, bahçıvan :)
^ pointer anlamına gelir, bir değişkenin pointerına erişirsin, ha bu değişkeni bir pointer tanımlı değişkene atarsın, ha değişkeni ^ işareti kullanarak pointer olarak kullanırsın. pascal dan kalma kullanım şeklidir ^ karekterini kullanmak. göze karmaşık geldiği için kullanımı şekline eklediler. compiler her iki türlü yazmıda kullanır. Ben pascaldan alışkanlık gerekirse ^ kullanır geçerim. illaki bir isim daha kullanmayı gereksiz görüyorum. Bu kullanma alışkanlığına bağlı

Kod: Tümünü seç

type
  TKayitItem = record
    a,b:Integer;
  end;
var
  Liste:TList;
  Kayit:^TKayitItem;
begin
  Liste := TList.Create;
  New(Kayit);
  Kayit.b := 3;
  Liste.Add(Kayit);
end;
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: Dinamik hafıza dizilerinde anlamadığım bir konu

Mesaj gönderen ertank »

Merhaba,

Pointer kullanımında "caret" (^) işaretinin iki türlü kullanımı vardır. Bir tür belirleyicinin solunda bulunduğu zaman Pointer ilgili türü işaret edilen bir pointer olur.

Kod: Tümünü seç

PKayitItem = ^TKayitItem;
Caret işareti bir pointer sonrasında kullanıldığı zaman ise Pointer tarafından tutulan hafızada saklı değeri çevirir.

Kod: Tümünü seç

Kayit^.a := 5;
Eğer derleyici ayarlarında EXTENDED SYNTAX "{$X+}" açık ise ki Delphi için standart olarak bu açıktır. Bu durumda caret işareti pointer kulanımında zorunlu olmaz. Kullanılmadığı durumlarda derleyici varmış gibi davranarak gerekli EXE kodunu oluşturur.

Ancak Extended Syntax açık olduğu hallerde dahi pointer başka bir pointer'a referansta bulunduğu zaman karışıklığı önlemek adına kullanılması gerekir.

Bunun dışında örnek kodunuzda hafıza kaçağı mevcut. Aşağıdaki şekilde bu kaçağı gidermek mümkün olacaktır

Kod: Tümünü seç

var
  Liste:TList;
  Kayit:PKayitItem;
begin
  Liste := TList.Create;
  try
    New(Kayit);
    try
      Kayit^.a := 5;
      Kayit.b := 3;
      Liste.Add(Kayit);
    finally
      Dispose(Kayit);
    end;
  finally
    Liste.Free();
  end;
end;
aligel54
Üye
Mesajlar: 41
Kayıt: 20 Nis 2009 11:34

Re: Dinamik hafıza dizilerinde anlamadığım bir konu

Mesaj gönderen aligel54 »

Cevaplarınız için teşekkür ederim. O zaman ^ kullanmadan devam edeceğim.

Hafıza bırakma işlemini dediğin gibi zaten yapıyorum. Kod kısa olsun diye yazmamıştım. Hatırlattığın için sağol.
Cevapla