Forum: Ders Arası RSS
Sihirli Sayı 48!
Sayısal args[] işleme...
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Sihirli Sayı 48!
Merhaba,

D dili üzerinde bir proje geliştirince çok fazla şeye ihtiyaç duyuyor insan. Dersleri baştan sona okumamanın acısını çekiyorum...:)

Bugün istedim ki yazdığım projeye dışarıdan parametre gireyim. Ama bunun ilk değeri sayısal olduğu için biraz önce adeta afalladım. Bunu nasıl yapacaktık; bilmiyordum! Ben de basamağın kuvveti ile çarpmayı düşündüm. Herhalde yanlış bir şey (magicNumber'a dikkat!) yapıyorum, sizce?
void main(string[] param) {
    int n, magicNum = 48;
    foreach(args; param[1 .. param.length])
    {
        n = 0;
        foreach(a, arg; args) //n += (cast(int) arg) * 10^^a;/*
            n += (cast(int) arg - magicNum) * 10^^(args.length-a-1);//*/
        writefln("%d, length=%d", n, args.length);
    }
Çıktısı:
salih@DB-N150-N210-N220:~/d.ders$ ./argTest 704 45
704, length=3
45, length=2


Yani cast ile ilk argument'i int'e çevirmek yetmiyor bir de 48 sayısında çıkarmak gerekiyor. Bu sayı nereden geliyor böyle...:)

Dip Not: Eğer kodu denerseniz, lütfen bir de gizlenmiş satırı (//) açığa çıkarın, zaten diğeri otomatikman gizlenecek; sayıların anormal şekilde büyüdüğünü göreceksiniz.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
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ı
ASCII tablosunda '0' karakterinin değeri 48'dir.

Biliyorsun, cast'in sorumlusu sensin. ;) O işlemi ancak program parametrelerini oluşturan UTF-8 kodlamalarının sayısal basamaklar olduklarından eminsen kullanabilirsin. Çünkü sonuçta Unicode standardının belirli bir kodlamasının parçalarını onlu sayı sistemi basamakları olarak kullanıyorsun.

Doğru bir işlem mi? Yukarıdaki gibi anlatınca kulağa öyle gelmiyor. ;)

Ali
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali Hocam, şunu mu demek istiyorsun:

./argTest 704 45 dediğimizde, aslında programa main(string[] param) vasıtasıyla şu veriler mi giriyor:

param[0] = "a\0r\0g\0T\0e\0s\0t\0";
param[1] = "7\00\04\0";
param[2] = "4\05\0";


Eğer öyleyse dizge(string)'nin uzunluk değeri üç değil de 6 yazması, iki değil de 4 yazması gerekmez mi?

704, length=3
45, length=2


Anlamakta zorlanıyorum; kusura bakmayın...:)

Yoksa bu Linux'a özel bir durum mu? Şimdi Windows'a geçeyim çünkü aynı sonucu alıp almayacağımı merak ettim doğrusu...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #4
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:
./argTest 704 45 dediğimizde, aslında programa main(string[] param) vasıtasıyla şu veriler mi giriyor:

param[0] = "a\0r\0g\0T\0e\0s\0t\0";
param[1] = "7\00\04\0";
param[2] = "4\05\0";

Hayır. UTF-8 değişken uzunluklu bir kodlamadır. ASCII tablosunun karakterlerine denk gelen Unicode karakterleri UTF-8'de tek kodla ifade edilirler.

UTF-16 olsaydı ASCII karakterleri hep birisi 0 olan iki kodla kodlanırlardı.

Eğer öyleyse dizge(string)'nin uzunluk değeri üç değil de 6 yazması, iki değil de 4 yazması gerekmez mi?

Doğru. Yani 3 ve 2 olması doğru.

Yoksa bu Linux'a özel bir durum mu? Şimdi Windows'a geçeyim çünkü aynı sonucu alıp almayacağımı merak ettim doğrusu...

D dili parametreleri string[] olarak veriyorsa hepsi de UTF-8 olarak kodlanmışlardır. Programın çalıştığı ortamın özellikleri bizi ilgilendirmez.

cast(int)arg yaptığın zaman UTF-8 kodunu alıyorsun ve bir tamsayı olarak kullanıyorsun. '0' karakterinin UTF-8 kodu 48 olduğu için 0 değerinin kendisini elde etmek için 48 çıkartman gerekiyor. Çünkü '0' bir karakterdir. Onun UTF-8 kodunun değeri 0 değildir, 48'dir. '0' karakterinden 0 tamsayı değerini elde etmek için 48 çıkartmak gerekiyor.

Ali
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şimdi anlıyorum, yok mu şu UTF...:)

Ben de dizgi ve doğal olarak dizilerdeki ayırma karakteri (\0) zannediyorum. Meğer cast()'in orada döndürdüğü kod tablosundaki karşılığıymış ki sıfır rakamı, 48. sırada yer alıyormuş. Sanırım bir kaç if() ile olası bütün yanlış verileri eleyebilirim. Şimdi hissettiğim belirsizlik dağıldı ve geleceğe güvenle bakıyorum...

Ancak cast()'i bir dönüştürücü olarak görüyordum ki tam anlamında öyle olmadığını görüyoruz. Hani bir çok dilde olsa str2int veya strtoint gibi işlevler vardır ya. Benim hatırladığım genel kanı içeriğindeki tüm sayısal değeri adeta filitre ederdi. Alışkanlık işte!
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, 10:59:16 (UTC -08:00)