Forum: D Programlama Dili RSS
Kullanıcı tanımlı türü işlev geri dönüşü olarak
cos00kun #1
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Kullanıcı tanımlı türü işlev geri dönüşü olarak
D dilinde kullanıcı tanımlı bir türü (yapı,sınıf v.s..) işlev dönüş türü olarak tanımlayabiliyor muyuz ?
import std.stdio;
 
struct Deneme {
....
....
}
 
void oku() {
.....
.....
}
 
void main()  {
    Deneme deneme;
    readln();
Burada yanlış hatırlamıyorsam kitabımızın sınıf bölümünde aslında sınıf üretmenin kullanıcı tanımlı yeni bir tür üretmek olduğundan bahsediyordu.. Bu durumda aklımca işlevlerde dönüş türü olarakta neden kullanılmasın diye düşündüm.. Bu durumda void yerine Deneme yada deneme neden kullanamıyorum ?
E=mc^2
kerdemdemir #2
Üye Eyl 2013 tarihinden beri · 168 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
//DMD64 D Compiler 2.072.2
 
import std.stdio;
 
struct Deneme
{
 
}
 
Deneme Oku()
{
   return Deneme(); 
}
 
void main()
{
    writeln("Hello, World!");
}
http://rextester.com/HYSEL18534

Deneme oku() C'de D'de derlenir. Bir kotu yani donus degerinin kopyalanmasi olabilir ama bu sikca kullanilan bir durumdur.

auto temp = Oku(); ---> Burda kopyalama olabilir ama derleyiciler bunu genelde optimize ediyorlar detay icin(http://en.cppreference.com/w/cpp/language/as_if)

deneme oku() --> derlenmez cunku
Deneme deneme; Burda "Deneme" bir tur fakat "deneme" bir degisken ismi. Fonksiyon parametreleri ve donus degerlerinde turler kullanilir.
cos00kun #3
Üye Kas 2014 tarihinden beri · 262 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
sanırım anladım sağol :-)
import std.stdio;
 
struct Yapı {
    int a=5;
    int b=50;
    float c= 23.47;
}
 
Yapı birşeylerYap(Yapı yapı_) {
    yapı_.a+=10;
    yapı_.b+=10;
    yapı_.c+=10f;
return yapı_;
}
 
void main()  {
    Yapı yapı;
 
    writeln("Önce a=",yapı.a);
    writeln("Önce b=",yapı.b);
    writeln("Önce c=",yapı.c);
 
    yapı=birşeylerYap(yapı);
 
    writeln("Sonra a=",yapı.a);
    writeln("Sonra b=",yapı.b);
    writeln("Sonra c=",yapı.c);
 
    readln();
}
E=mc^2
kerdemdemir #4
Üye Eyl 2013 tarihinden beri · 168 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ne demek faydasi oluyorsa ne mutlu . Birkac yorum daha yapabilirim aslinda:

// Burda aslinda referans olarak gecmek daha iyi olurdu .
// Cunki farkinda olmasak bile yapı = birseylerYap(yapı) dedigimizde :
// 1 - Parametre kopyaliniyor
// 2 - Donus parametresi kopyaliniyor. Kopyalamanin kacinmak istememiz ise performans amacli oluyor genelde ozellikle buyuk objelerde.
Yapı birşeylerYap(Yapı yapı_) {  
    yapı_.a+=10;
    yapı_.b+=10;
    yapı_.c+=10f;
return yapı_;
}
 
Yani soyle : 
 
void birşeylerYap( ref Yapı yapı_) { // eger C++ olsaydi "Yapi& yapi" olurdu   
    yapı_.a+=10;
    yapı_.b+=10;
    yapı_.c+=10f;
}
 
}

Bu yapiyi donus degeri olarak kullanma genelde soyle durumlarda lazim oluyor bana.

 
 
Yapı birşeylerYap() {
   Yapı cokkullanilanDegerler = Yapi( 42, 42, 42.0) ; // Bu fonksiyonun icinde yaratildigi icin disariya referans yollayamam 
                                                                                  // Kopyalama kacinilmaz. 
   return cokkullanilanDegerler;
}

Bazende paralel programlama yaparken kopyalama yapmak kacinilmaz olabiliyor. Bir cok baska durumlarda vardir ama aklima ilk gelenler bunlar oldu.

Erdemdem
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2018-02-24, 02:25:36 (UTC -08:00)