August 10, 2009

Dizilerle ilgili dersi yazarken şuna takıldım:

import std.stdio;

void main()
{
   // Ancak başına 'static' yazınca derleniyor
   int[200] seyrek_dizi = [ 50:111, 100:111 ];

   int indeks;
   while (indeks < seyrek_dizi.length) {
       write(seyrek_dizi[indeks], " ");
       ++indeks;
   }

   writeln();
}

Orada dizi tanımını 'static' veya 'const' yapmak gerekiyormuş. Koymayınca ilgisiz bir mesaj veriyor. (?) Daha anlamadım... :( Anlayan varsa anlatsın... :)

Ayrıca 'slice''ların yazımı da çok karışık. (Bu derste anlatmayacağım; sonraya bırakıyorum.) Dinamik diziye çok benziyor:

import std.stdio;

void main()
{
   int[10] statik_dizi;
   // statik_dizi.length = 7;  // HATA: uzunluğu değişmez

   int[] dinamik_dizi;
   dinamik_dizi.length = 10;   // uzunluğu değişir

   // dilim, statik_dizi'nin elemanlarına bir referans
   // oluyor.
   int[] dilim = statik_dizi[5..8];
   dilim[0] = 1; // statik_dizi[5]'e karşılık geliyor
   writeln("dilim, statiği değiştirdi  : ", statik_dizi[5]);

   // Sonundaki dup'a dikkat:
   int[] kopya = statik_dizi[5..8].dup;
   kopya[1] = 2; // statik_dizi[6]'nın kopyası
   writeln("kopya, statiği değiştirmedi: ", statik_dizi[6]);
}

Yani 'dilim''i değiştirince asıl dizi değişiyor, ama tabii 'kopya''yı değiştirince değişmiyor. Ama yazımlarındaki fark, o sondaki '.dup'. Bence farkını daha belirgin yapmalıymışlar. (Bir önerim yok ama. :D )

Ali

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

3 days ago

On Tuesday, 11 August 2009 at 00:05:30 UTC, Ali Çehreli (acehreli) wrote:

>
import std.stdio;

void main()
{
   // Ancak başına 'static' yazınca derleniyor
   int[200] seyrek_dizi = [ 50:111, 100:111 ];

   int indeks;
   while (indeks < seyrek_dizi.length) {
       write(seyrek_dizi[indeks], " ");
       ++indeks;
   }

   writeln();
}

Anlayan varsa anlatsın... :)

Çoooook eski ve arka sayfalarda kalmış bu mesajı hortlatmak zorundayım çünkü değerli. Adeta toprak altına gömülmüş bir hazine!

Ne yalan söyleyeyim; bu zamana kadar statik dizilerde böyle bir özellik olduğunu bilmiyordum. Hoca derse yazdıysa da ben görmemişim, benim kusurum :)

>

Orada dizi tanımını 'static' veya 'const' yapmak gerekiyormuş. Koymayınca ilgisiz bir mesaj veriyor. (?) Daha anlamadım... :(

Güncel sürümlerde böyle bir hata yok. İster const yazın, isterseniz static veya her ikisini. Özetle bu özellik harika! Bir de hocanın örneğine yaptığım düzenlemeye bakın hele; aşağıda neler oluyor neler :)

import std.stdio;

void main()
{
   int[64] dizi = [ 15: 2, 31: 4, 47: 6, 63: 8 ];
   int indeks;

   while (indeks < dizi.length)
   {
     if (auto değer = dizi[indeks++])
     {
       değer.writeln;

     } else {

       write("0 ");
     }
   }
}
/* ÇIKTISI:
dmd -run "app.d" (C:\D\dene\source dizininde)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8
Derleme başarılı.
*/

SDB@79