Delphi Can

Orjinalini görmek için tıklayınız: Değişkene fonksiyon aktarma
Şu anda (Arşiv) modunu görüntülemektesiniz. Orjinal Sürümü Görüntüle internal link
Hocam ben c++ Builder'de program geliştiriyorum,componentleri ortak olması nedeniyle delphi'ye merak sardım şu aralar.Delphi'de pointerlere bakarken bir şey dikkatimi çekti ,internette de biraz araştırdım ama tatmin edici cevaplar bulamadım.Mevzu şu:


type
  fact=function (x:integer):integer;


var
  Form5: TForm5;

implementation

{$R *.dfm}

function factoriel(x:integer):integer;
  begin
  if x<=1 then result:=1
  else result:=x*factoriel(x-1);
  end;

procedure TForm5.Button1Click(Sender: TObject);
var
hesap:^fact;
i:integer;
begin
  hesap := @i;
  hesap^:=factoriel;
  ShowMessage(IntToStr(HESAP^(5)));
end;


Burada standart fonksiyon gösteren pointer örneği var; ama tip tanımlanırken ,yani şu ifadede  "type fact=function (x:integer):integer;" bir pointer tipi değil değişken tipi tanımlanıyor fakat kaynaklarda bunun pointer tipi tanımlanması olduğu söyleniyor.o zaman şu kodun çalışmaması lazım ama çalışıyor:


function factoriel(x:integer):integer;
  begin
  if x<=1 then result:=1
  else result:=x*factoriel(x-1);
  end;

procedure TForm5.Button1Click(Sender: TObject);
var
  hesap: function (x:integer):integer;
  i: integer;
begin
   hesap:=factoriel;
   ShowMessage(IntToStr(hesap(5)));
end;

end.


Çünkü Burada hiç pointer yok.Burdan şu sonuç mu çıkıyor pointer kullanıılmadan da değişkenlere tipini belirterek -örneğin: hesap:function (x:integer):integer;-  fonksiyon ataması yapabiliriz.ben c++ mantığıyla mı düşünüyorum yoksa bunlar doğru mu ?Burayı yanlış kavramam ciddi hafıza hatalarına sebep olabilir bu yüzden bir arkdaşım beni aydınlatırsa sevinirim. Teşekkürler şimdiden.
(30-07-2017, Saat: 12:23)savasabd Adlı Kullanıcıdan Alıntı: [ -> ]Hocam ben c++ Builder'de program geliştiriyorum,componentleri ortak olması nedeniyle delphi'ye merak sardım şu aralar.Delphi'de pointerlere bakarken bir şey dikkatimi çekti ,internette de biraz araştırdım ama tatmin edici cevaplar bulamadım.Mevzu şu:

type
  fact=function (x:integer):integer;


var
  Form5: TForm5;

implementation

{$R *.dfm}

function factoriel(x:integer):integer;
  begin
  if x<=1 then result:=1
  else result:=x*factoriel(x-1);
  end;

procedure TForm5.Button1Click(Sender: TObject);
var
hesap:^fact;
i:integer;
begin
   hesap:=@i;
   hesap^:=factoriel;
          ;
 ShowMessage(IntToStr(HESAP^(5)));
end;

Burada standart fonksiyon gösteren pointer örneği var; ama tip tanımlanırken ,yani şu ifadede  "type fact=function (x:integer):integer;" bir pointer tipi değil değişken tipi tanımlanıyor fakat kaynaklarda bunun pointer tipi tanımlanması olduğu söyleniyor.o zaman şu kodun çalışmaması lazım ama çalışıyor:

function factoriel(x:integer):integer;
  begin
  if x<=1 then result:=1
  else result:=x*factoriel(x-1);
  end;

procedure TForm5.Button1Click(Sender: TObject);
var
hesap:function (x:integer):integer;
i:integer;
begin
   hesap:=factoriel;
 ShowMessage(IntToStr(hesap(5)));
end;

end.

Çünkü Burada hiç pointer yok.Burdan şu sonuç mu çıkıyor pointer kullanıılmadan da değişkenlere tipini belirterek -örneğin: hesap:function (x:integer):integer;-  fonksiyon ataması yapabiliriz.ben c++ mantığıyla mı düşünüyorum yoksa bunlar doğru mu ?Burayı yanlış kavramam ciddi hafıza hatalarına sebep olabilir bu yüzden bir arkdaşım beni aydınlatırsa sevinirim. Teşekkürler şimdiden.

Birinci durumda bir Typed Pointer, ikinci durumda bir Untyped Pointer tanımlamış oluyorsunuz. Untyped Pointer tanımına sahip olan Hesap isimli değişkene yaptığınız atama (yani factoriel metodu)'nın signature'ı Untyped Pointer'ınız ile uyumlu olduğu için bir sorun çıkmıyor. Ayrıca Typed Pointer tanımı yaptığınız bölümde pointer değişkeninize neden "i" değişkeninin adresini aktardığınızı anlamlandıramadım.
http://docwiki.embarcadero.com/RADStudio...s_(Delphi) Hocam burada aradığım cevabı buldum ben.
var
hesap,hsp:^fact;
i:integer;
begin
hesap := @i;
hsp:=@i;
hesap^:=factoriel;
ShowMessage(IntToStr(hsp^(5)));
end;

hocam ,hesap pointerine adres olarak i değişkeninin adresini verdim,bir nevi new() le yer ayırmak yerine doğrudan adres gösteriyorum.nitekim yukardaki hsp'ye atanan adresle yine aynı fonksiyon çalışır.
var
hesap:^fact;
i:integer;
begin
 new(hesap);
 hesap^:=factoriel;
 ShowMessage(IntToStr(hsp^(5)));
end;
yada bu genel haliyle bir farkı yok.