Forum: Ders Arası RSS
readf ile satır okunamaz
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ı: readf ile satır okunamaz
Süper Zeka oyununu 2.053 ile derlemeye çalışırken std.cstream'i de kaldırıp yerine de std.stdio kullanmak istedim:

        char[] okunan;
        // ...
            din.readf(&okunan);

satırını şöyle değiştirdim:

            readf(" %s", &okunan);

Ama program takıldı! :( Biraz uğraştıktan sonra kendi yazdığım şu sayfadaki "readf yerine readln ve chomp" başlığını bularak tekrar öğrendim! :-p (Yaşlanıyorum! :)):

  http://ddili.org/ders/d/dizgiler.html

Satır okumak için doğrusu aşağıdaki gibi. Ve böylece 'okunan'ı string olarak da tanımlayabildim (din.readf ile char[] olmak zorundaydı)::

        string okunan;
        // ...
            okunan = chomp(readln());

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ı
Hocam bu olay az önce benim de başıma geldi. Aklımda chomp() vardı ama bir türlü beceremedim. Sonra bu başlık imdadıma koştu. Önce D.ershane'ye bakmıştım. Sanki oraya buradaki bilgileri eklemeli ya da ben bulamadım...:(

Bu arada foreach(dchar oku; okunan) yapsam bile Türkçe karakterlerde cortladığımı gördüm...:)

Off kafam şişti...:(
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ı
Salih Dinçer:
D.ershane'ye bakmıştım. Sanki oraya buradaki bilgileri eklemeli

Hangi sayfada olduğu yukarıda var. ;)

foreach(dchar oku; okunan) yapsam bile Türkçe karakterlerde cortladığımı gördüm

Garip. İstersen başka bir konuda konuşalım. Küçücük bir progamla... ;)

Ali
Avatar
Salih Dinçer #4
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Hangi sayfada olduğu yukarıda var. ;)
Bu başlığı gören, bulan, ilgili dersin D.ershane bağlantısından kolaylıkla faydalanır. Ama bu sorunla karşılaştığımız zaman ilk olarak Girişten Bilgi Almak başlığına bakıyoruz. Sonra belki bir üst veya altındaki başlığa. Sıklıkla yaptığın gibi dersler arası bağlantı koymak iyi bir fikir olaibilir mi?

acehreli:
Garip. İstersen başka bir konuda konuşalım. Küçücük bir progamla... ;)
Hemen kodu bir çırpıda yazdım, denedim ve sorunsuz neticeyi almam 1 dk. bile sürmedi...:)

Belki Linux ve DMD 2.062 kullandığım için sorun çıkarmadı, bilemiyorum ama şimdi Windows'a geçip sorunun hangi sürümde ve aşağıdaki kodda devam edip etmediğini öğreneceğim inşaallah...
import std.stdio;
import std.string;
 
void main() {
  string okunan = readln().chomp();
  
  foreach(i, oku; okunan) {
    if(!i) typeid(oku).writeln// immutable(char)
    oku.write;
  }
  writeln;
}
Bu kod Windows 7 işletim sistemi ve DMD 2.061'de istenildiği gibi Türkçe karakterler ile birlikte çalışmamaktadır. Belki konsol parametreleri ile alakası olabilir...
C:\DMD\derle\DProjeleri>testreadln
fdslfjldsjflsd
immutable(char)
fdslfjldsjflsd

C:\DMD\derle\DProjeleri>testreadln
üğüğüğü


C:\DMD\derle\DProjeleri>chcp
Etkin kod sayfası: 65001

C:\DMD\derle\DProjeleri>dmd
DMD32 D Compiler v2.061

Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Bu mesaj Salih Dinçer tarafından değiştirildi; zaman: 2013-05-06, 20:35.
Değişiklik nedeni: Windows test sonucu eklendi...
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Evet, başka PC'de denedim ve burada 2.062 var. İşin ilginci etkin kod sayfası 857 ayarlanmıştı ve sorun olmadığını gördüm. Yani böyle bir sorun ile Windows CMD kullanırken başınıza gelir ise "chcp 857" komutunu vermeniz gerekiyormuş.

Zaten bu Windows çok gıcık! SDL uygulamaları bile kötü çalışıyor, hatta göçüyor çalışmıyor. Bill Gates kullağın çınlasın emi...:)

D:\DMD\project>testreadln
TÜRKÇE KARAKTERLERİ: ğüşiöç destekliyor mu?
ğüğüğğüğüğfisdfidsifdsüfdspüfüsdfdsüüğüğü


D:\DMD\project>chcp 857
Etkin kod sayfası: 857

D:\DMD\project>testreadln
T├£RK├çE KARAKTERLER─░: ─ş├╝┼şi├Â├ğ destekliyor mu?
dpdsüfdğsüfğsdüf
immutable(char)
dpdsüfdğsüfğsdüf

Özetle bu kaput durumun bir çözümünü bilmiyorum. Çünkü standart girdideki sıkıntıyı giderseniz de ekranda Türkçe karakterler kötü gözüküyor. Tersinde ise yazılım çöküyor sanki! Dikkat edin if(!i) ile 1 kere ekrana bilgi geçmesi gerekiyor ama geçmiyor. Demek ki illegal bir durum oluyor ve döngüden çıkıyor!

Başarılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #6
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ı
Yanıtlanan mesaj #4
Salih Dinçer:
  string okunan = readln().chomp();
  
  foreach(i, oku; okunan) {

O 'oku'nun türü char tabii ki; bir de dchar yapmayı dener misin...

Senin de gördüğün gibi UTF-8 kodlarını Linux konsoluna teker teker göndermek sorun oluşturmuyor. UTF-8 kodları tek başlarına anlamsız olduklarından belki Windows konsolunun hoşuna gitmiyordur.

(İlgisiz not: Değişken isimleri 'oku' gibi emir kipinde seçilince ben alt üst oluyorum. Emir kipini işlevlerde görmeye o kadar alışmışım ki kodu anlayabilmek için iyice yoğunlaşmam gerekiyor. :) Aynısı dün gösterdiğin koddaki 'pop' ve 'push' değişkenlerinde de başıma gelmişti. Üstelik o kodda 'pop' ve 'push' adında işlveler de vardı! :) )

Ali
Avatar
Salih Dinçer #7
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
dchar yapmayı da denemiştim değişen bir şey yok. Sorun Windows'da ve/veya DMD'nin Windows uyumluluğunda.

Örneğin;

$ DMD sdlmini.d -debug -L-lSDL

Linux'da güzel bir şekilde derlenip "-lSDL" parametresi linker'a doğru dürüst aktarılır. Ama Windows'da aktarılmaz!

:\>DMD sdlmini.d -debug -L"-lSDL"

Yukarıdakin de ise bır sıkıntı olmadığını, cmd.exe ile dmd.exe arasında bir uyuşmazlık yaşanmadığını ve link.exe doğru parametre gittiğini tespit ettim.

Dip Not: Kendime özgü bir tarzım olduğunu kabul ediyorum. Bu benim, kendi seçimlerin ve değiştirmem çok güç. En azından artık kümeleme parantezlerini daha sık kullanıp satır başı karakter yaparak sıkışık kod kullanımında uzaklaşıyorum. Ama yinede 2 satırda if()else'ler yazmak hoşuma gidiyor...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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, 13:20:20 (UTC -08:00)