Kitabı İngilizce'ye çevirirken hatalarla da karşılaşıyorum. Bunların bazıları dmd geliştiği için ortaya çıkıyor. Örneğin şuradaki ikiliAra() işlevinin int döndürmesi derleme hatasına neden olduğu için size_t olarak değiştirdim(eceğim):
http://ddili.org/ders/d/sablonlar.html
Çünkü kod içindeki ortaNokta gibi indeks değerlerinin türü size_t'dir. size_t de platformuna göre 32 veya 64 bit işaretsiz bir tür olduğu için 32 bitlik int ile uyumsuzdur.
O basit derleme hatasını ortadan kaldırdığımda kodun ayrıca hatalı olduğunu da farkettim. Aşağıdaki program 10 değerli elemanın dizide bulunduğunu ve 4 indeksli yerde olduğunu iddia ediyor:
import std.stdio;
// Aranan değeri bulursa, değerin dizide hangi indekste
// bulunduğunu, bulamazsa size_t.max döndürür.
size_t ikiliAra(const int[] değerler, in int değer)
{
// Dizi boşsa, bulamadık demektir
if (değerler.length == 0) {
return size_t.max;
}
const auto ortaNokta = değerler.length / 2;
if (değer == değerler[ortaNokta]) {
// Bulduk
return ortaNokta;
} else if (değer < değerler[ortaNokta]) {
// İlk yarıda aramaya devam etmeliyiz
return ikiliAra(değerler[0 .. ortaNokta], değer);
} else {
// Son yarıda aramaya devam etmeliyiz
return (ortaNokta + 1
+ ikiliAra(değerler[ortaNokta + 1 .. $],
değer));
}
assert(false, "Buraya hiç gelinmemeliydi");
}
void main()
{
auto dizi = [ 1, 2, 3, 4, 5 ];
immutable aranan = 10;
immutable indeks = ikiliAra(dizi, aranan);
writefln("%s değerinin indeks değeri: %s", aranan, indeks);
writefln("%s indeksindeki değer: %s", indeks, dizi[indeks]);
}
Çıktısı:
'10 değerinin indeks değeri: 4
4 indeksindeki değer: 5
'
Bu gibi hatalara rastlayınca kendinize saklamayın lütfen! ;)
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]