Thread overview
Şablonlar bölümündeki ikiliAra() işlev şablonu hatalı
Jan 18, 2012
Salih Dinçer
January 08, 2012

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. ]

January 18, 2012

Bu çok güzel bir örnek. Ayrıca düzeltme için de teşekkürler. Çünkü dili öğrenme aşamasındaki kişiler örnek kodları deneyip de hatalar ile karşılaşması büyük bir hayal kırıklığı olabiliyor...

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

January 18, 2012

Kendimi özenli olarak bilirim. Buna rağmen her türlü hata oluyor. İnsanlık... :) Herhangi bir nedenle neresini okusam hep daha da düzeltecek bir şeyler buluyorum. O yüzden her çalışmanın içinde başkaları da olmalı.

Hatalar görüldükçe söylenmeli. Düzeltelim. :)

Ali

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