July 03, 2012

Öncelikle, buradaki soruların "D Dilimleri" makalesindeki eksikliklerden kaynaklandığını varsayıyorum:

http://ddili.org/makale/d_dilimleri.html

Yoksa nasıl olsa hepimiz onu okumuşuzdur. ;)

Alıntı (canalpay):

>

b'yi başka yere taşıyacağına a'yı taşısa ve b'yi yine yeni taşıdığı alan için dilim yapsa daha tutarlı olmaz mı

Program b ile ilgilendiği sırada o elemanlara erişim sağlayan başka dilimlerden habersiz olduğundan onlar için eleman kopyalayıp onları düzeltemez:

void foo(int[] a)
{
   a ~= 5;    // a'nın eriştirdiği elemanlara başka kim eriştiriyor?
              // Burada bilmek olanaksızdır.
}

(Tabii ki olanaklıdır ama çok masraflı olur. D gibi sistem dilleri öyle özel işlere karışmazlar.)

Alıntı:

>

dilimden dinamik diziye terfi ettirerek

Ama D programcısının gözünde dilimden başka kavram yok. Dinamik dizi dediğiniz şey D runtime'ının perde arkasında bizim için idare ettiği bir şey.

Ali

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

July 03, 2012

Schveighoffer'den devam edelim mi?

int[] a;     // boş dilim hiçbir veriye erişim sağlamaz ama
            // kendisine yine de eleman eklenebilir

a ~= 1;      // eleman eklenir; elemanları tutmak için
a ~= 2;      // otomatik olarak yeni bir dizi oluşturulur

a ~= [3, 4]; // başka bir dizi eklenir; burada 'dizi hazır
            // değeri' (array literal) ekleniyor
a = a ~ a;   // a'yı kendisi ile birleştirir; şimdi a'nın
            // durumu şudur: [1, 2, 3, 4, 1, 2, 3, 4]

int[5] b;    // program yığıtındaki sabit uzunluklu bir dizi
a = b[1..$]; // şimdi a, b'nin bir dilimidir
a ~= 5;      // bu işlemden önce a yığıttaki verilere erişim
            // sağlamakta olduğundan, sonuna eklemek yeni
            // yer ayrılmasına neden olur ve herşey
            // beklendiği gibi çalışır

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

July 03, 2012

Evet capacity()'e göre belli oluyor:

import std.stdio;
void main()
{
   int[] a;
   a ~= 1;
   a ~= 2;
   a ~= [3, 4];
   a = a ~ a;
   int[] b;
   for(int i; i < 10; ++i){
       b ~= i;
   }
   a = b[1 .. $];
   writeln(capacity(a));
   writeln(capacity(b));
   a ~= 5;
   a[1] = 3;
   writeln(a);
   writeln(b);
}
/*Çıktı:
15
14
[1, 3, 3, 4, 5, 6, 7, 8, 9, 5]
[0, 1, 3, 3, 4, 5, 6, 7, 8, 9]
*/

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

July 03, 2012

Alıntı:

>

a = b[1..$]; // şimdi a, b'nin bir dilimidir
a ~= 5; // bu işlemden önce a yığıttaki verilere erişim
// sağlamakta olduğundan, sonuna eklemek yeni
// yer ayrılmasına neden olur ve herşey
// beklendiği gibi çalışır
Ben denemeyemiyorum ancak b dinamik dizi olsaydı a ile b ayrılmayacaklardı değil mi?

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

July 03, 2012
import std.stdio;
void main()
{
   int[] a;a.reserve(30);
   a ~= 1;
   a ~= 2;
   a ~= [3, 4];
   a = a ~ a;
   int[] b;b.reserve(30);
   for(int i; i < 10; ++i){
       b ~= i;
   }
   a = b[1 .. $];
   writeln(capacity(a));
   writeln(capacity(b));
   a ~= 5;
   a[1] = 3;
   writeln(a);
   writeln(b);
}

Kapasite yettiği halde neden kapasite artıyor?

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

July 03, 2012

Bilmem ama burada sanki şu satırdan dolayı a'nın bir eksilmesi söz konusu, öyle ya 1..$ aralığı alınmış:

a = b[1 .. $];

Bakınız şu örnekte ise başlangıçta 0 olan a'ya 31 birimlik yer ayrılıyor...

int[] a;
a.capacity.writeln; // 0
a.reserve(30);
a.capacity.writeln; // 31

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

July 03, 2012

Alıntı (canalpay):

>

b dinamik dizi olsaydı a ile b ayrılmayacaklardı değil mi?

Bunu capacity()'nin dönüş değerinden anlayabiliyoruz:

http://ddili.org/makale/d_dilimleri.html

Ali

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

July 04, 2012

Ben reserve ile istediğimiz alan kadar ayırabiliyoruz sanmışım ancak belirli periyotlarla 2n+1 ile hesaplıyor.

Örneğin 1 reserve ettiğimizde o ileride gerek olur diye 3(1'de 2'de 3'de reserve etsek dmd 3 ) reserve ediyor. 4 olunca 32+1; 8 olunca 72+1; oluyor doğal olarak 15'in üstüne çıkınca 15*2+1 şeklinde hesaplıyor bu da 31 :-) Biz de şansımıza 30 yazınca acaba dedik :-P

O zaman yinede bu dilimlerde reserve değil capacity'e güvenmek gerek anlamını taşıyor.

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

1 2
Next ›   Last »