Forum: Ders Arası RSS
Bir diziyi nasıl ifade edebiliriz
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Bir diziyi nasıl ifade edebiliriz
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.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.

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
erdem (Moderatör) #3
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
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.
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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.

Ş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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-21, 19:37:06 (UTC -08:00)