Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 5/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Değişkene fonksiyon aktarma
#1
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.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla
#2
(30-07-2017, Saat: 12:23)savasabd Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlHocam 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.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol 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.
Bizi Toprağa Gömdüler Fakat Tohum Olduğumuzu Bilmiyorlardı.
Cevapla

Konuyu Paylaş : facebook gplus twitter



Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  function ile fonksiyon tanımlama arsl01 3 131 08-07-2018, Saat: 12:11
Son Yorum: narkotik
  FastReport "Sum" Fonksiyon Sorunu hyperxman 6 557 17-08-2017, Saat: 20:40
Son Yorum: hyperxman
  static değişkene Default değer atama! bozli54 3 419 26-05-2017, Saat: 15:35
Son Yorum: Fesih ARSLAN
  İki db arası veri aktarma Dostk 7 727 28-01-2017, Saat: 21:38
Son Yorum: Dostk
  Object Pascal - 2 Farklı Fonksiyon Bildirimi İbrahim 1 459 14-01-2017, Saat: 07:25
Son Yorum: Tuğrul HELVACI



Konuyu Okuyanlar: 1 Ziyaretçi