Forum: Ders Arası RSS
Şablonlar bölümündeki ikiliAra() işlev şablonu hatalı
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Şablonlar bölümündeki ikiliAra() işlev şablonu hatalı
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
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 11:11:42 (UTC -08:00)