Thread overview
Kullanıcı tanımlı türü işlev geri dönüşü olarak
Jan 24, 2018
cos00kun
Jan 24, 2018
kerdemdemir
Jan 24, 2018
cos00kun
Jan 25, 2018
kerdemdemir
January 24, 2018

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 ?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 25, 2018
//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.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 25, 2018

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();
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

January 25, 2018

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]