Jump to page: 1 2
Thread overview
October 06, 2013
#define IS_IN_SEARCH(mb,offset) (mb.searchmask[(offset)/8] & (1<<((offset)%8)))
#define REMOVE_FROM_SEARCH(mb,offset) mb.searchmask[(offset)/8] &= ~(1<<((offset)%8));

Bu defineların D karşılığı nedir tam olarak? Fonksiyon gibi davranıyorlar burada ama tam olarak öyle değil.

Zekeriya

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

October 06, 2013

Sanırım bunu doğru şekilde D'de temsil edebilmemiz için mb'nin veri türünü doğru olarak bilmemiz gerekiyor. Sonra basit bir temsilci ile işimizi görebiliriz. Farz edelim MemoryBlock diye bir yapımız varsa:

struct MemoryBlock {
 uint searchmask[];
}

auto delegate (MemoryBlock, size_t ) IS_IN_SEARCH =
 (mb,offset) => mb.searchmask[offset/8] & 1<<(offset%8);

void delegate (MemoryBlock, size_t ) REMOVE_FROM_SEARCH =
 (mb,offset) { mb.searchmask[offset/8] &= 1<<(offset%8); }

Kolay gelsin...

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

October 06, 2013

Hocam bir şeyi merak ediyorum. Adının MemoryBlock olduğunu nereden bildiniz?

Zekeriya

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

October 06, 2013

Alıntı (zekeriyadurmus):

>

Hocam bir şeyi merak ediyorum. Adının MemoryBlock olduğunu nereden bildiniz?

Sadece tahmin ettim...:)

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

October 06, 2013

Bir kaç ekleme:

  1. Tür struct ise parametre olarak geçerken kopyalanacağından temsilcinin onu ref olarak alması gerekir.

  2. Genelde türünü bilmemiz gerekmez. Şablonlarda (ve temsilcilerde) tür çıkarsama var.

  3. C'de ve C++'ta makro geleneğine uygun olduğundan isimleri büyük harfli.

  4. Salih C dizi söz dizimini kullanmış. (Ben de hâlâ bazen öyle yazıyorum. :) )

Dolayısıyla şöyle de olur:

struct MemoryBlock {
 uint[] searchmask;
}

bool isInSearch(ref MemoryBlock mb, size_t offset)
{
   return (mb.searchmask[(offset)/8] & (1<<((offset)%8))) != 0;
}

void removeFromSearch(ref MemoryBlock mb, size_t offset)
{
   mb.searchmask[(offset)/8] &= ~(1<<((offset)%8));
}

Ali

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

October 07, 2013

Hocam ali hocamın yazdığı daha uygun oldu (delegate yerine) ama burada fonksiyon çağırımı gerçekleşiyor define da anladığım kadarıyla parametreleri gerekli yerlere yazıp kodu olduğu gibi oraya yazıp orada işletiyor yeni bir fonksiyon içerisine değil

Zekeriya

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

October 07, 2013

O zaman en iyisi mixin kullanımlarını daha detaylıca öğrenmem olacak :)

Bu arada yazıyı okudum çeviri için ellerinize sağlık :) Ve avukat esprisini nedense İngilizceden okuyunca anladım :) Sanırsam İngilizce cümledeki kelimelerin yeri ve vurgudan kaynaklanıyor veya ikinci kez okumuş olmamın bir etkisi var :)

Zekeriya

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

October 07, 2013

Hocam "a < b ? b : a" böyle bir ifademiz varsa ve programın çalışma esnasında 1nanosaniyeyi bile hesaba katıyorsak (Script dili için :) ) fonksiyon çağırımı oldukça gereksiz olacak. Heryere böyle uzun bir ifadeyi yazmakta yorucu ve boğucu olacaktır onun yerine otomatik olarak yazan bir sistem harika olurdu :)

Define olaylarına takmamın tek sebebi buydu :)

Zekeriya

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

October 07, 2013

Konu biraz mixin'lere kaymış...:)

İster istemez neler yapılabilir diye biraz kafa yordum. Öncelikle; evet, C'deki define komutuyla (önişleç sanırım) parametreler yerleştirilip kod olduğu gibi çağrıldığı yere yerleştiriliyor. Sakıncaları hakkında ve C++'da neden kurtulamadığımızı bilmiyorum. Ama biz mixin'e gelelim çünkü define'dan çok daha güçlü bir olanak D'de hali hazırda mevcut...

Şöyle düşündüm; biz eğer bir bit'in 1 olup olmadığını öğrendikten sonra onun üzerinde işlem gerçekleştireceksek, her iki işleve de aynı parametreleri göndermek zorunda kalırız. Gerçi bu işlevleri yapı içerisine alma ve/veya tek merkezden besleme mümkün ama farz edelim ki bu örnekleri, kodu fazla değiştirmeden sürdürmek zorundayız. Ancak defalarca parametreler ile kafayı yemek istemiyoruz!

En azından yazılım kararlılığını/bütünlüğünü sağlamak için bunu yapmalıyız. Çünkü insan hata yapar ve bir yerde A değerini yazarken, diğer tarafa B değerini yazdığında işler karışabilir.

Aşağıda bunu kodlarla ifade etmeye çalıştım. İlk olarak bit isminde ortak bir parametre tanımlayarak çalıştırdım ve her şey yolunda gitti. Hazır elimi atmışken '(T)'ür şablonu kullanarak işlevleri daha akıllı hale getirdim. Hoş template içine alınca bunu başaramadım ama lütfen her ikisini de deneyin. Çünkü her ikisi de çalışıyor ve farkı görmek için sadece '//' işaretini kaldırmanız yeterli:

import std.stdio;

struct MemoryBlock(T) {
 T[] searchmask;

 string toString() const {
   enum bitSize = format("%%.%sb ", T.sizeof * 8);
   string printOut;

   foreach_reverse(s; searchmask) {
     printOut ~= format(bitSize, s);
   }
   return printOut;
 }
}

bool isInSearch(T)(ref MemoryBlock!T mb, size_t offset) {
 enum bitSize = T.sizeof * 8;
 return ( mb.searchmask[offset / bitSize] &
                ( 1 << (offset % bitSize)) ) != 0;
}

void removeFromSearch(T)(ref MemoryBlock!T mb, size_t offset) {
 enum bitSize = T.sizeof * 8;
 mb.searchmask[offset / bitSize] &=
      ~( 1 << (offset % bitSize));
}

mixin template bitOp(alias mb, alias offset) {
 bool isInSearch() {
   return ( mb.searchmask[offset / 8] &
                  ( 1 << (offset % 8)) ) != 0;
 }
 void removeFromSearch() {
   mb.searchmask[offset / 8] &=
        ~( 1 << (offset % 8));
 }
}

void main(){
   auto mb = MemoryBlock!ubyte([0b1111_0000, 0b0000_1111]);
           //       bits:     7---^                    ^---8
   size_t bit = 8; assert(isInSearch(mb, bit));

   mb.writeln;

   //removeFromSearch(mb, bit); /*
   mixin bitOp!(mb, bit) op;
   if(op.isInSearch) op.removeFromSearch; //*/

   mb.writeln;
}

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

October 07, 2013

Alıntı (zekeriyadurmus):

>

burada fonksiyon çağırımı gerçekleşiyor

Orada çağrı yapan derleyiciyi çöpe at diyeceğim ama atsak atamıyoruz satsak satamıyoruz. :D En azından -O ile derlendiğinde işlev çağrısı olmaması gerek.

Alıntı:

>

define da anladığım kadarıyla parametreleri gerekli yerlere yazıp kodu olduğu gibi oraya yazıp orada işletiyor yeni bir fonksiyon içerisine değil

Doğru. #define, aslında C ve C++ dillerinin temel bir parçası değildir de, o dillerin önişlemcisinin bir komutudur (directive). Daha derleyici dil kurallarını işletmeden önce metin düzeyinde değişiklik yapar. Yararları yanında sakıncaları da boldur:

http://acehreli.org/turkcecpp/gotw_077.html

Bjarne Stroustrup C++'tan tamamen kaldırmaya çalışmış ama başaramamıştır. D'de yok.

Ali

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

« First   ‹ Prev
1 2