Merhaba,
Yaklaşık 1,5 haftadır, projeyi kısmen rafa kaldırmıştım ve haftasonu (yani dün, pazar günü) yeniden başladım. Rafdan indirdim demiyorum çünkü önemli sayfaları kafamda uçuşuyorlardı...:)
Neyse, şimdi bitirdim ama henüz yeni bir başlık açıp nakletmeden evvel iyice test etmeliyim. O zamana kadar, hemen test kodlarını vermeliyim. Bunu öylesine çok yapmak istiyorum ki "işte D'nin gücü" dermişcesine, bu büyük mutluluğu armağan etmeyi arzuluyorum:
union parçala {
ulong data;
ubyte[8] p8b;
ushort[4] p4s;
uint[2] p2i;
}
struct Tx {
parçala veri;
size_t dizin;
TypeInfo tür = typeid(ulong); // fixed a
this(T)(T değeri) {
this.dizin = 1; // artık ilk eleman 1...:)
this.veri = parçala(
cast(ulong)değeri);
this.tür = typeid(T); // boş kurulmamalı (a)
}
void popFront() {
dizin = empty() ? 0 : dizin + 1;
}
@property
bool empty() const {
return (dizin > tür.tsize());
}
@property
ulong front() const {
return dizin ? part(dizin) : veri.data;
}
@property
ubyte part(size_t i) const
in { assert(i, "0 alamaz!"); } body {
return i > tür.tsize() ? 0 : veri.p8b[i - 1];
}
T to(T)() {
switch(T.sizeof) {
case 1: return cast(T)veri.p8b[0];
case 2: return cast(T)veri.p4s[0];
case 4: return cast(T)veri.p2i[0];
default:
}
return cast(T)veri.data;
}
}
import std.stdio, std.conv, std.random;
char rasgeleSeç(string seçenekler) {
auto rasgeleSayı = uniform(0, size_t.max);
auto aralıkOranı = size_t.max / seçenekler.length;
size_t biriniSeç = rasgeleSayı / aralıkOranı;
return seçenekler[biriniSeç];
}
auto rasgeleTür(size_t adedi) {
Tx[] sonuç;
while(adedi--) {
final switch(rasgeleSeç("LISB10")) {
case 'L': ulong s7 = uniform(ulong.min, ulong.max);
sonuç ~= Tx(s7); break;
case 'I': uint s5 = uniform(uint.min, uint.max);
sonuç ~= Tx(s5); break;
case 'S': ushort s3 = uniform(ushort.min, ushort.max);
sonuç ~= Tx(s3); break;
case 'B': ubyte s1 = uniform(ubyte.min, ubyte.max);
sonuç ~= Tx(s1); break;
case '1': sonuç ~= Tx(true); break;
case '0': sonuç ~= Tx(false);
}
}
return sonuç;
}
void main() {
auto test = rasgeleTür(10);
foreach(t; test) {
//t.veri.data.writeln(": ", t.tür);/*
size_t adedi = t.tür is typeid(bool) ? 1 : t.tür.tsize() * 8;
string düzen = "%." ~ to!string(adedi) ~ "b";
writefln(düzen, t.veri.data);//*/
}
}
'Son bir söz:' Bu basit, rasgele veri türü seçen ve bunun içini yine rasgele veriler ile dolduran kodları C'de yapamazsınız demeyeceğim ama zorlanacağınız aşikar! Çünkü aynı dizi içinde farklı veri yapılarını başka bir yere aktarabiliyor, bunları istediğiniz esneklikte ekrana yazabiliyor ve/veya kullanabiliyorsunuz.
Alıntı (Örnek bir ekran çıktı...):
>'0011101101011110010011010110000010011111100000100011010110000010
0
1
0
0
1101111111100101100100010100001000111101110010100110011011010111
1101101111010111
10000010
1011110100001111
1'
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]