Thread overview
Bir diziyi nasıl ifade edebiliriz
Apr 04, 2011
erdem
Apr 04, 2011
erdem
April 04, 2011

Bir diziyi örneğin alt ve üst sınırlarını tutan iki veriyle ifade edebiliyoruz.

Buna göre ilk elemanın adresini ve dizinin uzunluğunu bildiğimizde bir dizi tanımlayabiliyoruz.

    int [] dizi = [ 1, 2, 3, 4, 5];

    int * p = &dizi[0] + dizi.sizeof;

Örneğin yukardaki ifade D için geçerli olur mu.

Bir de ilk elemanın adresini ve son elemandan bir sonraki hayali elemanın adresini bildiğimizde bir dizi bildirmek için yeterli oluyormuş sanırım. Bunu kodla nasıl ifade edebiliriz.

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

April 04, 2011

Alıntı (acehreli):

>

Alıntı (erdem):

>

ilk elemanın adresini ve dizinin uzunluğunu bildiğimizde bir dizi tanımlayabiliyoruz.

> >      int [] dizi = [ 1, 2, 3, 4, 5];
> >
> >      int * p = &dizi[0] + dizi.sizeof;
> > ```

> >
> > Örneğin yukardaki ifade D için geçerli olur mu.
>
> 1) dizi.sizeof yerine dizi.length yazılmak isteniyor. Çünkü dizi.sizeof her dizi için sabittir.
>

Yalnız doğru mu anladım bilmiyorum. '.sizeof 'kullandığımızda geçersiz oluyor '.length 'kullandığımızda dizinin hayali elemanını gösteriyor.

Bir de anladım ki ben bir şey okurken oradaki object kelimesini es geçmişim. Okuduğum kısım da şöyle bir şeydi.

*At a minimum, an **array object** keeps (or can compute in negligible time) two keys pieces of information, namely the upper and lower bounds of its data chunk.

Other representations are possible, for example, storing the address of the first element and the length of the block, or the address of the first element and the address just past the last element.*

Ben aslında o ikinci dizi gerçeklemesi nasıl olur diye düşünüyordum. Ama burda o *object* kelimesini atladığım için olayı tek boyuta indirgemişim :)

Şimdi D'nin dizi nesnesinin sizin bahsettiğiniz gibi iki boyutlu bir yapı olduğunu farkettim. Demek ki gerçeklemeyi birinci şekilde yapmışlar.

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

Alıntı (erdem):

>

ilk elemanın adresini ve dizinin uzunluğunu bildiğimizde bir dizi tanımlayabiliyoruz.

>      int [] dizi = [ 1, 2, 3, 4, 5];
>
>      int * p = &dizi[0] + dizi.sizeof;
> ```

>
> Örneğin yukardaki ifade D için geçerli olur mu.

İki hata var:

1) dizi.sizeof yerine dizi.length yazılmak isteniyor. Çünkü dizi.sizeof her dizi için sabittir. D dizilerinin şu yapının eşdeğeri olduklarını düşünebiliriz:


struct __Dizi
{
int * ptr;
uint length;
}



O yüzden sizeof her zaman için o türün uzunluğunu verir. (Tabii ki hayali bir tanım verdim.)

2) p, dizinin başını değil, sonundaki hayali elemanını göstermiş.

Geçerlidir ama onunla hiçbir şey yapmamız yasal olmaz.

Eğer dizinin başını gösterse, 'p'yi aynen C dizisi gibi kullanabiliriz ama o zaman da D'nin dizi olanaklarından yararlanamayız.

Ama dizinin başını göstermek için zaten dizilerin .ptr niteliği var. Yani p'ye gerek olmaz.

Alıntı:
>
> Bir de ilk elemanın adresini ve son elemandan bir sonraki hayali elemanın adresini bildiğimizde bir dizi bildirmek için yeterli oluyormuş sanırım. Bunu kodla nasıl ifade edebiliriz.
>

C'de yapılamaz.

C++'da std::vector'de yapılabilir (o zaman vector elemanların kopyalarına sahip olur).

D'de yapılabildiğini bilmiyorum. std.array modülünde bir şeyler olabilir ama hiç sanmıyorum.

Ali

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

Alıntı (erdem):

>

'.sizeof 'kullandığımızda geçersiz oluyor '.length 'kullandığımızda dizinin hayali elemanını gösteriyor.

Doğru. sizeof, eleman adedinden bağımsız olarak her dizi için aynı değeri (D'de dizi olanağını temsil eden yapının büyüklüğünü) döndürür.

Alıntı:

>

Şimdi D'nin dizi nesnesinin sizin bahsettiğiniz gibi iki boyutlu bir yapı olduğunu farkettim. Demek ki gerçeklemeyi birinci şekilde yapmışlar.

İki boyutlu dizi diye bir kavram da varken "iki boyutlu" demek karışıklık yaratıyor. :) İki düzeyli mi demeliyiz acaba: diziyi temsil eden nesne, ve o nesnenin ptr üyesi ile erişilen elemanları.

Ali

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