March 03, 2013

64bit'de deneyemedim ama 2 işlev için 8 bayt bellek alanı işgal ettiğine göre, depo dizisi 16 elemanlı olacaktır:

depola(&ikiKatı, &yarısı).length.writeln; // 8

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

March 03, 2013

Şu program iki işlev göstergesini baytlar halinde saklıyor ve sonra oradan çağırıyor:

import std.stdio;
import std.range;

int ikiKatı(int i)
{
   return i * 2;
}

int yarısı(int i)
{
   return i / 2;
}

// Baytların ne tür bir işlevi gösterdiklerini bilmek zorundayız tabii ki
alias İşlevTürü = int function(int);

ubyte[] depola(İşlevTürü[] işlevler...)
{
   ubyte[] depo;
   foreach (işlevAdresi; işlevler) {
       void * çiğ = &işlevAdresi;
       ubyte[] baytlar = cast(ubyte[])(çiğ[0..İşlevTürü.sizeof]);
       depo ~= baytlar;
   }

   return depo;
}

void çağır(ubyte[] depo)
{
   while (!depo.empty) {
       auto işlev = cast(İşlevTürü*)(depo.ptr);

       // İşlevi çağırıyoruz
       writefln("İşlevin sonucu: %s", (*işlev)(10));

       depo.popFrontN(İşlevTürü.sizeof);
   }
}

void main()
{
   ubyte[] depo = depola(&ikiKatı, &yarısı);
   çağır(depo);
}

Ali

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

1 2
Next ›   Last »