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.
Herhangi bir basit problem, hakkında yeterince toplantı yapılarak, çözümsüz hale getirilebilir.

Cevapla
#2
(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.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#3
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.
Herhangi bir basit problem, hakkında yeterince toplantı yapılarak, çözümsüz hale getirilebilir.

Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  DBGrid1'deki Verileri Tabloya Aktarma OZCANK 8 592 26-05-2020, Saat: 17:21
Son Yorum: Ahmet İPEKÇİ
  [Ödüllü Soru] Object türüne göre nesne üreten fonksiyon Abdullah ILGAZ 0 206 18-05-2020, Saat: 23:22
Son Yorum: Abdullah ILGAZ
  Gövdesiz Fonksiyon serdar 7 883 07-02-2020, Saat: 12:02
Son Yorum: serdar
  değişkene atadağımzı deger prg içnde sürekli kalması hk. sadikacar60 10 1.676 17-01-2020, Saat: 17:24
Son Yorum: sadikacar60
  [ÇÖZÜLDÜ] mysql fonksiyon wiseman 3 699 04-12-2019, Saat: 18:17
Son Yorum: frmman



Konuyu Okuyanlar: 1 Ziyaretçi