Thread overview
Fonksiyon çağırırken boş struct gönderme
Feb 14, 2013
Salih Dinçer
Feb 14, 2013
Salih Dinçer
February 13, 2013

Merhaba :)
struct Token;

Token calcIt(Token token = null){
if(token is null){
//işlemler
}
}

calcit adı altında bir işlevim var bu işleve bazen Token göndereceğim bazen göndermeyeceğim ama işlevlerde böyle bir kullanım yok bunun yerine ne var?

Zekeriya

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

February 13, 2013

İşlevin 2. yüklemesini yapabiliyorum evet ama bu işlevde yeterince kod var aynısını 2 farklı yer içi düzenlemek yoracaktır. Diğer yönteme gelince bu sefer o fonksiyonu her çağırdığımızda
S gidecek = S();
foo(&s);
şeklinde fazladan bir tanımlama yapacağız. Bunu yapmanın başka bir yolu yok mu?

Zekeriya

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

February 13, 2013

Bir kaç seçeneğin var:

İşlevin iki yüklemesini yazmak:

struct S{}

void foo(){}

void foo(S){}

void main()
{
   foo();
   foo(S());
}

Gösterge almak:

struct S{}

void foo(S *s = null)
{
   if (s) {
   }
}

void main()
{
   foo();

   auto s = S();
   foo(&s);
}

İkinci yönteme şurada "Mantıksal ifadelerde kullanılmaları" başlığı altında değinmişim:

http://ddili.org/ders/d/gostergeler.html

Ali

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

February 13, 2013

Boş olan işlevin tek satırdan oluşabilir. Eğer S.init değerinin özel bir anlamı olabiliyorsa asıl işlevin içinde onu denetleyebilirsin:

struct S{}

// Bu işlev tek satır
void foo()
{
   foo(S.init);
}

void foo(S)
{
   // Asıl işlemler burada...
}

void main()
{
   foo();
   foo(S());
}

Tam nasıl kullanmak istediğini bilmiyorum ama şablondan yararlanırsan bazı satırları bütünüyle koddan çıkartabilirsin:

import std.stdio;

struct S{}

enum ParametreGeçerli_mi { hayır, evet }

// Bu işlev tek satır (Not: Boş olsa bile şablon parametre listesi şart.)
void foo()()
{
   foo!(ParametreGeçerli_mi.hayır)(S.init);
}

void foo(ParametreGeçerli_mi parametreGeçerli_mi = ParametreGeçerli_mi.evet)(S)
{
   writefln("\n%s durumu için oluşturulmuş olan foo çağrıldı",
            parametreGeçerli_mi);

   static if (parametreGeçerli_mi == ParametreGeçerli_mi.evet) {
       writeln("Elimde geçerli bir S var");
       // Burada pahalı işlemler bulunabilir...

   } else {
       // ...
   }

   // Ortak işlemler burada...
}

void main()
{
   foo();
   foo(S());
}

Çıktısı:

'hayır durumu için oluşturulmuş olan foo çağrıldı

evet durumu için oluşturulmuş olan foo çağrıldı
Elimde geçerli bir S var
'
Ali

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

February 14, 2013

Kopya sınıfın adresini öğrenmede şu yöntem doğru mudur?

import std.stdio;//, sdb.algorithm;
class Atom {
 Base32v65 id;
 ubyte proton;
 ubyte[] orbits;

 this(ubyte atomNumber) {
   this.id = Base32v65("0123456789ABCDEFGHJKMNPQRSTVWXYZ");
   this.proton = atomNumber;
 }

 auto getId() @property {
   return &this;//id.encode(cast(ulong)&this);
 }
}
void main() {
 auto hidrojen = new Atom(1);
 auto oksijen = new Atom(2);

 hidrojen.getId.writeln(": Hidrojen Atomu");
 oksijen.getId.writeln(": Oksijen Atomu");

 writeln(hidrojen.getId, "\n", oksijen.getId);
}/*
7FFFB953EAC8: Hidrojen Atomu
7FFFB953EAC8: Oksijen Atomu
7FFFB953EAC8
7FFFB953EAA8
*/

Şu sebepten soruyorum...

Nedense ilk iki satırda adresler aynı geliyor ama aynı writeln() içinde farklı!

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

February 14, 2013

Kodu şimdi temiz bir bilgisayarda ve 32 bit'de denedim sonuç aynı...:(
'
12FE04: Hidrojen Atomu
12FE04: Oksijen Atomu
12FE04
12FDF8
'
Yani ya yöntemim yanlış ya da writeln() farklı satırlara rağmen şaşırıyor!

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

February 14, 2013

Aklıma bir şey gelmiyor ve bende bütün adresler doğru çıkıyor (şu iki satırı da çıkarttım ama

 // Base32v65 id;
// ...
   // this.id = Base32v65("0123456789ABCDEFGHJKMNPQRSTVWXYZ");

Ali

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