Thread overview
D.ershane Başka Dizi Olanakları
Mar 03, 2011
erdem
Mar 04, 2011
erdem
March 03, 2011

Alıntı:

>

Aralık söz dizimindeki doğal bir kısıtlama, başlangıç indeksinin bitiş indeksinden büyük olamayacağıdır:

>     char[] dizi = [ 0, 1, 2 ];
>     char[] dilim = dizi[2 .. 1];  // ← çalışma zamanı HATASI
>
> ```

>
**

char[] dizi = [ '0', '1', '2' ];

**
Burada ufak bir yazım hatası olmuş. Dizi elemanlarının tırnakları unutulmuş..

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

Öyle yazmak istemediğim açık ama o kod derleniyor. Yine de int[] olarak değiştireceğim.

Kodun derlenmesinin nedeni biraz ilginç aslında. O, şu kodun derlenebilmesini sağlayan nedenle derlenebiliyor:

   char c = 42;

Aslında açıkça bir uyumsuzluk var: sağda int, solda char. Öte yandan programcının ne yapmak istediği de açık: tabii ki 42 değerine sahip olan char oluşturmak istiyor.

Derleyicinin hiç şikayet etmeden kabul etmesinin nedeni, "Value Range Propagation" denen bir derleyici teknolojisi. Walter Bright çok yakın bir zaman önce bununla ilgili bir makale yazmıştı:

http://www.drdobbs.com/blog/archives/2011/02/value_range_pro.html

Aslında o makaleden uyarladığım şu örnek daha çarpıcı:

void foo(int i)
{
   char c = i;            // <-- DERLEME HATASI
   char c3 = i & 0x3F;    // <-- ama bu çalışır; süper! :)
}

İkinci satırın çalışmasının nedeni, derleyicinin 0x3f ile maskelendiği için değerin her zaman için bir char'a sığacağını görebilmesidir.

Erdem'in gösterdiği benim kodumun derlenememesi için değerlerden birisinin char'a sığamayacak kadar büyük olması yeter:

   char[] dizi = [ 0, 1, 2000 ];   // <-- şimdi DERLEME HATASI

Ali

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

March 04, 2011

Alıntı (acehreli):

>

Kodun derlenmesinin nedeni biraz ilginç aslında. O, şu kodun derlenebilmesini sağlayan nedenle derlenebiliyor:

>     char c = 42;
> ```

>

Evet daha önceki derslerin bir tanesinde anlattığınız gibi char değişkenlere karakterin ASCII ya da UTF-8 değerini atayıp kullanabiliyorduk.


import std.stdio;

void main ()
{
char a_harfi = 97;
writeln (a_harfi);
}



Ama bende hata veren kod şu şekilde:


import std.stdio;

void main ()
{
char [] dizi = [0, 1, 2];
writeln(dizi[dizi.length - 1]);
}



Çalışırken ilkönce konuyla ilgili örnekleri ben de yazıyorum. Sonra yazdığım örnekleri derleyip çalıştırıyorum. Sadece problemler bölümündeki soruları ilkönce kendim çözmeye çalışıyorum. Eğer çözemezsem çözümüne bakıyorum. Ya da kendi çözümümle sizin çözümünüzü karşılaştırıyorum.

Yalnız burada o kadar dikkatli kopyalamışım ki char [] dizisinin tüm elemanlarını ben de aynı şekilde yazmışım :)

Dizinin son elemanını yazdırmaya çalışıyorum. Baktım derleniyor ama hiç bir şey yazmıyor. Ben bu hata (<http://ddili.org/forum/thread/459>) ile üstüste gelince iyice afalladım. Çünkü windowsta bu programı çalıştırınca | bir karakter çıkıyor. Ben bunun sadece windows'un konsolundan olduğunu ve utf-8 karakterlerle ilgili sorun çıkarttığını düşündüm. Sonra registry ayarlarını konsol ilk açıldığında otomatik olarak utf-8 çalışacak şekilde değiştirmiştim. Onu geri aldım. MSN'in dökümantasyonuna baktım benzeri bir hata alan bulamadım :)

En sonunda sorunun yukardaki tırnak işaretlerinden kaynaklandığını farkettim.

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

Anladım. Yani derleme veya çalışma zamanı hatası yok. Beklediğimizi görememiş oluyoruz. :) Ben de derleme hatası oluyor sanmıştım.

Çıkışa kodu 2 olan karakter yazdırılıyor. O da ASCII tablosunda "start of text" karakteri olarak geçse de benim konsol fontumda içinde karakterin küçücük kodu bulunun bir şekil olarak görünüyor. (Çünkü konsolum ASCII değil, UTF-8.)

Bu arada bütün programları denediğin için teşekkürler. Böyle hataları yakalayacağız. :)

Ali

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