Thread overview
Sabit uzunluklu diziye (statik dizi) dilim döndürme tehlikesi
Jan 30, 2012
Salih Dinçer
Feb 05, 2012
Salih Dinçer
Feb 05, 2012
Salih Dinçer
December 09, 2011

Derleyicinin henüz yardım etmediği tehlikeli bir durum var. Derleyicinin geliştirilmesi için şu hata raporunu oluşturdum:

http://d.puremagic.com/issues/show_bug.cgi?id=7087

Dilimlerin elemanları uzun süre yaşatma gibi bir yan etkileri var. Elimizde tuttuğumuz dilimin elemanlarının geçerli olduklarını bekleriz. Ne yazık ki yerel bir statik diziye dilim döndürüldüğünde dilimin erişim sağlamaya devam ettiği elemanların yaşamları o kapsamdan çıkıldığında sona eriyor:

int[] dilimDöndüren()
{
   int[3] a;
   return a[];     // HATA: Döndürülen dilimin eriştirdiği elemanlar
                   //       geçerli olmayacaklar.

}// <-- a'nın elemanları bu noktadan sonra geçerli değiller

Bu konuya dikkat etmek gerek.

İşin kötüsü, işlevi biraz değiştirince kod yasal hale geliyor:

int[] dilimDöndüren()
{
   int[] a = [ 1, 2, 3 ];
   return a[];
}

Şimdi elemanlar çöp toplayıcıya ait oldukları için döndürülen dilim tarafından canlı tutulurlar.

Ali

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

January 30, 2012

Tam anlayamadım ama dilimleri anlayınca anlamış olacağımı ümit ediyorum...:)

Bu arada return ile birden fazla değer döndürülebiliyor mu? Öyleyse bu çok güzel bir haber. Gerçi işaretçi (pointer) ile de iş görüyor ama sevdim D'yi...:)

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

January 30, 2012

Alıntı (Salih Dinçer):

>

Tam anlayamadım ama dilimleri anlayınca anlamış olacağımı ümit ediyorum...:)

D'nin dizileri ve dilimleri C'den gelenlere karışık gelebilir. Beni zorlamışlardı. :)

Alıntı:

>

Bu arada return ile birden fazla değer döndürülebiliyor mu?

Teknik olarak hayır. Bütün dizi tek değer olduğu için dizi döndürülebiliyor. Ama dilim ise çok etkin oluyor, çünkü döndürülen şey yalnızca elemanlara erişim sağlayan küçük bir yapı... Yani bütün elemanlar kopyalanmıyorlar.

Öte yandan, sabit uzunluklu diziler oldukları gibi kopyalanıyorlar. (D'de dilimler referans türü, sabit uzunluklu diziler ise değer türü.)

Alıntı:

>

Gerçi işaretçi (pointer) ile de iş görüyor ama sevdim D'yi...:)

D'de açıkça işaretçi (bu forumda "gösterge" daha sık geçiyor) kullanmak çok az durumda gerekiyor.

Ali

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

February 05, 2012

Teşekkürler, gün geçtikçe daha çok şey anlıyorum...:)

Bu arada konu (dilimler) ile alakalı olsa gerek; emekliye ayrılmış (deprecated) bir özellik (property) dikkatimi çekti:
Alıntı:

>

When used inside an indexing or slicing expression, length is rewritten to be the length of the array being sliced.

> ...
> auto a = new int[5];
> a = a[0..length-1];
> ...
> ```

Doğrusu: a = a[0..a.length - 1]; şeklinde olmalıymış...

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

Alıntı (Ali Çehreli):

>

Baştan bana garip gelmişti ama $ hem daha kısa hem de herkes öyle yapıyor:

>     a = a[0 .. $ - 1];
> ```

Doğru ya...:)

Geçen dinamik diziler ile ilgili bir örnekte bu şekilde cevaplamıştınız. Gayet hoş, kısa ve kolay. Hatta nostalji! Çünkü $ ile birden geriye gittim. Sanırım BASIC'de kullanılıyordu, D dilini bir çok açıdan seviyorum. Şu misafir işleç (-bknz. D'de standart lambda function (<http://ddili.org/forum/thread/679>) kullanılabilir!) ile hayranlığım kat ve kat artıyor...:)

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

Alıntı (Salih Dinçer):

>

Doğrusu: a = a[0..a.length - 1]; şeklinde olmalıymış...

Baştan bana garip gelmişti ama $ hem daha kısa hem de herkes öyle yapıyor:

   a = a[0 .. $ - 1];

Ali

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