Thread overview
February 02, 2013

Başlık çok saçma oldu ama ne yazacağımı bilemedim doğrusu.

http://www.autoitscript.com/autoit3/docs/functions/MsgBox.htm

Bu üstteki adreste msgbox fonksiyonunun flag değerini yazarken

4 + 16 + 256 şeklinde rakamları toplayıp gönderebiliyoruz ve fonksiyon hangi flag değerlerinin gönderildiğini anlayabiliyor.

Bunu nasıl yapabiliriz?

Zekeriya

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

February 02, 2013

Sorunun cevabı ikilik düzende yatıyor:

  • 4 demek 3.bit,
  • 16 demek 5.bit,
  • 256 ise 9. bit demek...

Yani sayı değerleri toplamı her bayrağı ayrı ayrı etkiliyor.

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

February 02, 2013

Çok mantıklı :)

Birde 4 olduğu gibi 8 12 de oluyor. Ama bunlar beraber kullanılamıyorlar. Sadece bu serinin 1 değeri kullanılabiliyor. Peki ya bunun kontrolünü nasıl yapacaz?

Zekeriya

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

February 02, 2013

Bit İşlemleri bölümünde "Bayraklar" başlığı altında bir şeyler var:

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

Üç bayraktan yalnızca birisinin kullanıldığını ancak sen denetleyebilirsin. Mikroişlemci (ve dolayısıyla dil) böyle bir destek vermiyor.

Burada farklı bir tasarım düşünmek daha doğru olabilir. O üç değer hangi kavramı temsil ediyorsa o kavram için bir enum tanımlanır ve işlev onu farklı bir parametre olarak alır:

enum Sıcaklık { soğuk, ılık, sıcak }
void foo(Sıcaklık s);

Programcı isterse yine de bunu yanlış kullanabilir:

   foo(Sıcaklık.ılık + Sıcaklık.sıcak);  // HATA

O kadarına enum'la engel olamayız. Daha da sağlam olmasını istersek bu kavramı temsil eden bir yapı tanımlar ve bu yapının üç nesnesini kendi modülümüzde oluştururuz:

struct Sıcaklık
{
private: // Burada herşey korumalı. Modülden başkasını ilgilendirmiyor

   // Yine bir enum
   enum SıcaklıkDerecesi { soğuk, ılık, sıcak }

   SıcaklıkDerecesi derece;
}

// Kullanıcılar bu üç nesneden birisini kullanacaklar
Sıcaklık soğuk = Sıcaklık(Sıcaklık.SıcaklıkDerecesi.soğuk);
Sıcaklık ılık = Sıcaklık(Sıcaklık.SıcaklıkDerecesi.ılık);
Sıcaklık sıcak = Sıcaklık(Sıcaklık.SıcaklıkDerecesi.sıcak);

void foo(Sıcaklık s)
{
   if (s == soğuk) {
       // ...
   }
}

Kullanıcı kodu artık toplama gibi saçma işlemler uygulayamaz:

   // Kullanıcılar normalde bunu 'ılık' diye yazmazlar da modülün adıyla
   // benimModül.ılık diye yazarlar. Bu örnekte herşey aynı modülde
   // olduğundan çalışabiliyor.
   foo(ılık);
   foo(sıcak);
   // foo(ılık + sıcak);   // Sıcaklık yapısının toplama işlemi
                           // tanımlanmadığından bu şimdi bir derleme hatasıdır.

Ali

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