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ı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.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
Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız. 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
  Fonksiyon içinde create edilenler seci20 8 260 22-07-2019, Saat: 15:38
Son Yorum: Tuğrul HELVACI
  IPhone resim aktarma sorunu adelphiforumz 10 388 10-07-2019, Saat: 20:00
Son Yorum: SimaWB
  fonksiyon içinde parametreye default değer atama sorunu adelphiforumz 6 371 24-05-2019, Saat: 11:20
Son Yorum: adelphiforumz
  Unit içerisinde procedure/fonksiyon/sabit malitutuncu 2 383 29-03-2019, Saat: 18:09
Son Yorum: malitutuncu
  tablodaki kayıtları diziye aktarma salih 7 615 06-03-2019, Saat: 08:42
Son Yorum: Tuğrul HELVACI



Konuyu Okuyanlar: 1 Ziyaretçi