Alıntı (Kadir Can):
> Sanıyorum ki bu büyük bir bug.
Bu aslında çok ilginç bir konu. Bir çok ayrıntıyla ilgisi var. :)
Ne yapmaya çalışıyoruz? Bir giriş akımından belirli bir Unicode kodlamasına uyan bir karakter çekmeye çalışıyoruz.
O kadarı kolay, ama bu gerçekten mümkün mü?
Örneğin benim açtığım bir hata vardı: din.readf "false" veya "true"yu bool değer olarak okuyamıyordu: http://d.puremagic.com/issues/show_bug.cgi?id=3223 Mantıklı bir istek: eğer bool değerler "false" ve "true" olarak yazdırılıyorlarsa, bunun tersi de bulunmalı.
Ama bu aslında int'ler için bile geçerli değil: çıkışa art arda 4 ve 2 yazdırsak "42" olarak yazılıyor; ama girişte "42" varken iki tane int okumaya kalksak birincisi 42 oluyor, ikincisi ise girişte karakter belirene kadar bekliyor. Yani aslında aradığımız simetri giriş çıkış işlemlerinde doğal olarak yok.
Tekrar "false" ve "true"ya dönersek, diyelim girişte "truva" diye karakterler var. bool bir değer okumak istediğimizde "tru"nun okunacağını ama sonra 'v'nin beğenilmeyeceğini düşünürüz. Bu durumda bir hata atılmalıdır (int beklendiğinde "abc" geldiğinde atılıyor.).
Hata atıldığı zaman, o ana kadar okunmuş "tru"ya ne olmalıdır? Giriş akımından çekilmiş ve kayıp edilmiş mi olmalıdır, yoksa daha sonraki bir işlemde girişten string okumak istendiğinde "truva" okunsun diye elde bekletilmeli midir?
Onu olabilmesi için stdin akımının kendisine ait bir ara belleğinin bulunması gerekir. Çünkü standart giriş, programın dış dünyasına bağlı bir akımdır. Örneğin konsolda çalışan bir programa giriş karakterleri konsol ortamı tarafından teker teker verilir. Konsola "bu karakterleri şimdilik beğenmedik, lütfen geri al" diyemiyoruz. O yüzden stdin nesnesi her aldığı karakteri bir ara bellekte bekletmek durumundadır. O ara belleğin büyüklüğü ne kadar olmalıdır? "false"tan anlaşıldığına göre, bool olarak kabul edilemeyen bir karakter dizisi geldiğini en fazla 5 karakter okuduktan sonra anlayabiliyoruz. Yani bu ara bellek 5 karakterlik olabilir.
Ama bu 5 değeri bool için geçerli. Kendi türlerimizi okurken bir hata atılsa? Belki de kendi türümüzün nesnesi bin karakter okuduktan sonra mutsuz oluyordur. O bin karakter de saklanmalı mıdır?
Bunların yanıtları stdin'in ne tür bir aralık olarak kabul edildiği ile ilgili. Bir giriş aralığı mı (input range), yoksa bir ilerleme aralığı mı (forward range)?
Bunların yanıtlarını ben de bilmiyorum. Bunları yalnızca basit olması gereken bu konunun aslında bazı karışıklıklar içereceğini göstermek için yazdım.
Girişten char, wchar, ve dchar okumanın da aslında bu konulara dokunduğunu farkettim. Bunun nedeni, bu üç türün aslında bir kodlama ile ilgili olmaları. Her kod dizisi geçerli bir Unicode karakterine karşılık gelmiyor olabilir. O yüzden, "tru" örneğinde gördüğümüz gibi, o ana kadar okunanların bir ara bellekte tutulması gerekebilir.
İşte böyle. :/ Yeni öğrenenlerin işini güçleştiriyor. Onun için de birisi kullanışlı bir kaç işlev yazdığını söylemişti. Sırf yeni öğrenenler için eklemeyi düşünürlerse yararlı olacak. Şöyle bir şey:
auto yaş = oku!int("Yaşınız?");
'oku' işlevi girişten bir int okuyacak ve onu döndürecek.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]