December 05, 2010

Çok boyutlu dizi oluşturmak D'de çok kolay:

   /* 4 satıra 5 sütunluk bir dizi */
   auto alan = new int[][](4, 5);

C'de olsa, en dıştaki düzey dışındakilerin teker teker malloc'la oluşturulmaları gerekir. (Aslında tek malloc'la da halledilebilir; ama o, dizinin satırlarının uzunluklarının değişmeyeceği durumlarda kullanışlıdır.) C++'da std::vector büyük kolaylık getirir aslında.

Aşağıdaki de üç boyutlu dizi kullanan bir program. Yalnızca ilk satırı bizi ilgilendiriyor; gerisi diziyi yazdıran kodlar:

import std.stdio;
import std.string;
import std.conv;

void main()
{
   /* 3 düzlem, 4 satır, ve 5 sütundan oluşan dizi */
   auto dizi = new int[][][](3, 4, 5);

   /* Burada içini doldurduğumuzu varsayalım; örnek: */
   dizi[2][2][2] = 1;

   /* Bundan sonrası güzel olarak göstermek için */
   foreach (düzlemNumarası, düzlem; dizi) {
       foreach (satırNumarası, satır; düzlem) {
           write(satırBaşı(düzlemNumarası, satırNumarası));

           foreach (sütun; satır) {
               write(sütun, ' ');
           }
           writeln();
       }
       writeln();
   }
}

string satırBaşı(int düzlemNumarası, int satırNumarası)
{
   string girinti = repeat("  ", 2 * düzlemNumarası);

   /* Yalnızca ilk satıra yazalım */
   string düzlemBilgisi = (satırNumarası == 0
                           ?
                           "d" ~ to!string(düzlemNumarası) ~ " "
                           : "   ");

   return girinti ~ düzlemBilgisi ~ " ";
}

Çıktısı:

'd0 0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

d1 0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

   d2  0 0 0 0 0
       0 0 0 0 0
       0 0 1 0 0
       0 0 0 0 0

'

'd', düzlem numarasını bildiriyor. (Aslında düzlem yerine derinlik demek daha doğru herhalde.)

Ali

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