Thread overview
Sihirli Sayı 48!
Mar 05, 2012
Salih Dinçer
Mar 05, 2012
Salih Dinçer
Mar 05, 2012
Salih Dinçer
March 05, 2012

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?
Alıntı:

>
> 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...

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
March 05, 2012

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'\0'r'\0'g'\0'T'\0'e'\0's'\0't'\0'"';'
'param['1'] = '"7''\0''0'''\0''4''\0''"';
'param['2'] = '"4'\0'5'\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...

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 05, 2012

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 05, 2012

Alıntı (Salih Dinçer):

>

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

''param['0'] = '"a'\0'r'\0'g'\0'T'\0'e'\0's'\0't'\0'"';'
'param['1'] = '"7''\0''0'''\0''4''\0''"';
'param['2'] = '"4'\0'5'\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ı.

Alıntı:

>

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.

Alıntı:

>

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

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

March 06, 2012

Ş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!

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]