August 01, 2012
import std.stdio;
import giriscikis;
import std.bitmanip;


class Ekran
{
   union
   {
       ubyte seçenekleri;
       mixin(bitfields!(bool, "yanıpsönme", 1,
                        bool, "imleçaç", 1,
                        bool, "panelaç", 1,
                        bool, "aktif", 1,
                        ubyte,"", 4));
   }

   this ()
   {
       this.aktif = true;
       this.panelaç = true;
       this.imleçaç = true;
       this.yanıpsönme = true;
   }
}

class Lcd
{
   Ekran ekran;

   this()
   {
       ekran = new Ekran();

   }

   void yaz() {};

   void sil(){};
}

void main()
{}

Kabaca sınıfın temellerini oluşturuyordum ki hızlıca aklıma gelen bir soru. Örneğin burada 'Ekran''ı ve 'Lcd''yi yapı olarak tanımlamayı düşünüyordum. Kullanıcı tanımlı değişken varsayılan kurucu gerektiriyorsa hemen aklımıza sınıf yapmak mı gelmeli.

Bir lcd panelin bir ekranı olacağı için içerme -- has a relationship -- ilişkisiyle oluşturdum.

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

August 01, 2012

Evet, struct'lar için varsayılan kurucu tanımlanamıyor. Bunun nedeni, D'de her türün ilk değerinin derleme zamanında bilinmesinin şart olmasıymış. Aslında CTFE olanağı da olduğuna göre derleyicinin varsayılan kurucuyu neden derleme zamanında işletmediğini bilmiyorum. Bu konuda işler benim için de biraz karışık.

Bu sıkıntı türün 'static opCall()'u ile giderilebiliyor:

import std.stdio;
import std.bitmanip;

struct Ekran
{
   union
   {
       ubyte seçenekleri;
       mixin(bitfields!(bool, "yanıpsönme", 1,
                        bool, "imleçaç", 1,
                        bool, "panelaç", 1,
                        bool, "aktif", 1,
                        ubyte,"", 4));
   }

   static Ekran opCall()
   {
       Ekran ekran;

       ekran.aktif = true;
       ekran.panelaç = true;
       ekran.imleçaç = true;
       ekran.yanıpsönme = true;

       return ekran;
   }
}

void main()
{
   auto e = Ekran();
   writefln("%02x", e.seçenekleri);
}

opCall(), nesnenin işlev gibi çağrılabilmesini sağlar. static olunca nesne olmadan türün ismi işlev gibi kullanılıyor. Böylece kurucu söz dizimine de benziyor ve herşey yolunda gidiyor. (Bu konuyu da kitaba eklemem gerek.)

Bu durumda başka bir seçenek daha var:

struct Ekran
{
   union
   {
       ubyte seçenekleri = 0xf;                 // <-- İlk değer
       mixin(bitfields!(bool, "yanıpsönme", 1,
                        bool, "imleçaç", 1,
                        bool, "panelaç", 1,
                        bool, "aktif", 1,
                        ubyte,"", 4));
   }
}

Şansımıza o da işe yarıyor.

Alıntı:

>

Bir lcd panelin bir ekranı olacağı için içerme -- has a relationship -- ilişkisiyle oluşturdum.

Bence doğrusu o.

Ali

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

August 02, 2012

Çok teşekkürler. İki yöntem de güzelmiş. Öğrendiğim iyi oldu :-)

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

1 2
Next ›   Last »