Forum: Ders Arası RSS
D.ershane Başka Dizi Olanakları
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: D.ershane Başka Dizi Olanakları
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ş..
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ı
Ö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_p…

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
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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 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.
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ı
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
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-18, 22:41:44 (UTC -08:00)