Thread overview
8.1 Boşlukların Gözardı Edilmelerinin Gerekmesi
Feb 15, 2022
Ali Çehreli
Feb 15, 2022
Ali Çehreli
Feb 17, 2022
Ali Çehreli
February 15, 2022

D-Programlama Dili Kitabı, sayfa: 36 (pdf 'de sayfa: 36) 'da Verilen Örnek Üzerine

Verilen örneği çalıştırdığımda kitaptaki sonucun aynısını görmeyi umuyordum:

>

import std.stdio;

void main( ){
write("Okulda kaç öğrenci var ?");
int öğrenci_sayısı;
readf("%s", &öğrenci_sayısı);
write("Okulda kaç öğretmen var? ");
int öğretmen_sayısı;
readf("%s", &öğretmen_sayısı);
writeln(
"Anladım: okulda ", öğrenci_sayısı, "öğrenci",
" ve ", öğretmen_sayısı, "öğretmen varmış.");
}

Kitaptaki Çıktı:

> >

Okulda kaç öğrenci var? 100
Kaç öğretmen var? 20

Benim çıktıma göre "Kaç öğretmen var?" Diye bir soru gelemiyor.
İşte benim uçbirimimdeki çıktı:

>

Okulda kaç öğrenci var ?10
std.conv.ConvException@/usr/include/dmd/phobos/std/conv.d(2502): Unexpected '\n' >when converting from type LockingTextReader to type int

??:? int std.conv.parse!(int, std.stdio.LockingTextReader, 0).parse(ref >std.stdio.LockingTextReader) [0x55b439f573b5]
??:? int std.conv.parse!(int, std.stdio.LockingTextReader, 0).parse(ref >std.stdio.LockingTextReader, uint) [0x55b439f5702d]
??:? int std.format.internal.read.unformatValueImpl!(int,

>

std.stdio.LockingTextReader, char).unformatValueImpl(ref std.stdio.LockingTextReader, scope ref
const(std.format.spec.FormatSpec!(char).FormatSpec)) [0x55b439f568d8]
??:? int std.format.read.unformatValue!(int, std.stdio.LockingTextReader, >char).unformatValue(ref std.stdio.LockingTextReader, scope ref
const(std.format.spec.FormatSpec!(char).FormatSpec))
[0x55b439f567b8]
??:? uint std.format.read.formattedRead!(std.stdio.LockingTextReader, char, >int*).formattedRead(ref std.stdio.LockingTextReader, const(char)[], ref int*) [0x55b439f51074]
??:? uint std.stdio.File.readf!(int*).readf(scope const(char)[], ref int*) [0x55b439f50fca]
??:? uint std.stdio.readf!(int*).readf(scope const(char)[], int*) [0x55b439f50f2c]
??:? _Dmain [0x55b439f4f961]
Okulda kaç öğretmen var?


(program exited with code: 1)
Press return to continue

Evet, program yürütülürken kitapta öğretmen_sayısı 'nın okunamayacağı yazıyor. Ama program bana "Kaç öğretmen var?" sorusunu göstermeliydi. Sizce bu hatamı nasıl çözebilirim?

(Bu arada önceki sorumun çözümüne %d ve writefln() eklediğiniz için sağolun, Salih hocam. :) Yeni başlık açmam konusunda haklısınız Ali hocam ve beni soru sormaya teşvik ettiğiniz için size bir kere daha teşekkür ederim. :) )

February 15, 2022
On Tuesday, 15 February 2022 at 17:11:52 UTC, İsmail Emre ARIKAN wrote:
>  D-Programlama Dili Kitabı, sayfa: 36
 Kitaptan sayfa 16 'da. Henüz kitabın çıktısını almadığım anlaşıldı. :) Nasipse cumartesiye...
February 15, 2022
On 2/15/22 09:11, İsmail Emre ARIKAN wrote:

>     Kitaptaki Çıktı:
>>> Okulda kaç öğrenci var? 100
>>> Kaç öğretmen var? 20
>
> Benim çıktıma göre "Kaç öğretmen var?" Diye bir soru gelemiyor.

Bende de öyle. Demek ki standart kütüphanede bir şeyler değişmiş. Bunu da düzelteceğim.

> Ama program bana "Kaç öğretmen var?" sorusunu göstermeliydi.
> Sizce bu hatamı nasıl çözebilirim?

Hata, güncelliğini biraz yitirmiş olan kitapta. :) (Kitabın söylediği gibi, programın doğru çalışması için %s'den önce boşluk yazmak yetecek.)

> önceki sorumun çözümüne %d

Sözü açılmışken, ben özel bir nedeni olmadığı sürece hep %s kullanıyorum. Kendi kafamda şöyle görüyorum: Yazarkenki anlamı, "okunur biçimde (dizgi gibi) yazdır"; okurkenki anlamı, "türün kendisine uygun olarak oku."

100 gibi tamsayı okurken %s'nin işe yaradığını yukarıdaki örnekte de görüyoruz.

%s'nin en büyük yararı, bir değişkenin türünü değiştirince bir de onu değiştirmemek. Derleyiciden ve kütüphaneden yararlanıyorum: Ne gerekiyorsa yapsınlar. :)

Ama tabii küsuratına önem verdiğim kesirli sayı gibi bir durumda %s kullanmıyorum.

Ali

February 15, 2022
On 2/15/22 09:16, İsmail Emre ARIKAN wrote:

> kitabın çıktısını almadığım
> anlaşıldı. :) Nasipse cumartesiye...

Eyvah! Kağıtlara acı. Neredeyse 800 sayfa! :)

Ali

February 15, 2022
On Tuesday, 15 February 2022 at 17:24:22 UTC, Ali Çehreli wrote:
> On 2/15/22 09:11, İsmail Emre ARIKAN wrote:

> > Ama program bana "Kaç öğretmen var?" sorusunu göstermeliydi.
> > Sizce bu hatamı nasıl çözebilirim?
>
> Hata, güncelliğini biraz yitirmiş olan kitapta. :) (Kitabın söylediği gibi, programın doğru çalışması için %s'den önce boşluk yazmak yetecek.)
>
> > önceki sorumun çözümüne %d
>
> Sözü açılmışken, ben özel bir nedeni olmadığı sürece hep %s kullanıyorum. Kendi kafamda şöyle görüyorum: Yazarkenki anlamı, "okunur biçimde (dizgi gibi) yazdır"; okurkenki anlamı, "türün kendisine uygun olarak oku."
>
> 100 gibi tamsayı okurken %s'nin işe yaradığını yukarıdaki örnekte de görüyoruz.
>
> %s'nin en büyük yararı, bir değişkenin türünü değiştirince bir de onu değiştirmemek. Derleyiciden ve kütüphaneden yararlanıyorum: Ne gerekiyorsa yapsınlar. :)
>
> Ama tabii küsuratına önem verdiğim kesirli sayı gibi bir durumda %s kullanmıyorum.
>
> Ali

 Sağolun Ali Hocam, şimdi çalışıyor. Artık %s 'nin solundaki bir tane boşluğun sebebini daha iyi anlıyorum. Evet, D-programlama dili bu yönüyle de c-programlama dilinden ayrılıyor. Ve sizin öneriniz üzerine ben de öyle yapmaya gayret edeceğim.
February 16, 2022
On 2/15/22 9:11 AM, İsmail Emre ARIKAN wrote:

> Benim çıktıma göre "Kaç öğretmen var?" Diye bir soru gelemiyor.

Bu konu düşündüğümden daha karmaşık çıktı. :) Dikkat edersen, aslında sende de yazdırılıyor ama hatadan sonra!

>> Okulda kaç öğrenci var ?10
>> std.conv.ConvException@/usr/include/dmd/phobos/std/conv.d(2502):
>> Unexpected '\n' >when converting from type LockingTextReader to type int
>> ----------------
[...]
>> Okulda kaç öğretmen var?

İşte orada! :)

stdout'ta bekleyen karakterler önce bir ara belleğe yazılırlar ve normalde '\n' karakteri görülünce çıkış cihazına gönderilirler ("flush edilirler"). Benim programımda ise write() kullanıldığı için '\n' karakteri gönderilmiyor.

Ama başka bir kural (gelenek?) daha var: stdout'un ara belleğindeki karakterler stdin'den okuma yapılacağı zaman da cihaza gönderilirler.

Ben kitabın o bölümünü yazdıktan sonra o ikinci kuralın davranışı değişmiş: Artık önce hatayı yazdırıyorlar. Veya şöyle mi düşünmeliyim: Yine stdout.flush() yapıyorlar ama artık stderr'i stdout'tan önce mi yazdırıyorlar? İngilizce forumda sordum:

  https://forum.dlang.org/post/suk3v4$1dti$1@digitalmars.com

Ali