Forum: Ders Arası RSS
Dizilerin ~= operatörü ile genişlemesi
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ı: Dizilerin ~= operatörü ile genişlemesi
Aslında ben bu sorunun cevabını biliyorum. Ama dilin ilginç bir özelliği olduğu için sizinle paylaşmak istedim.
    auto a = [87, 40, 10, 2];
    auto b = a;                 // Şimdi a ve b aynı diziyi gösteriyorlar
    a ~= [5, 17];               // a ya bir şeyler ekledik
    a[0] = 15;                  // a[0] 'ı değiştiriyoruz
    assert(b[0] == 15);         // bu assert ifadesi geçerli olur mu? 

Yani a[0]'da yapılan değişiklik b[0]'da geçerli olur mu? Kısacası a ve b hala aynı diziyi mi gösteriyorlar?
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ı
Hmmm... Bence bir hata olmalı; veya ben D dizilerini tam anlamamışım. Eğer forumda sen sormazsan ben soracağım çünkü ikinci satırı şöyle değiştirince fark oluyor:

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

Hataya çok açık bir konu... :-/ Umarım derleyici hatasıdır da o satırdaki o kadarcık fark bu kadar büyük etki yapmaz.

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ı
Bu sorunun yanıtı 
    assert(b[0] == 15);

ifadesi b[0] 15 olabilir ya da olmayabilir şeklinde değil mi? Yani dil b[0]'ın 15 olup olmaması konusunda D dili bir garanti vermiyor. Örneğin ilk durumda iki dizi aynı yeri gösteriyorlardı. Sonra

    a ~= [5, 17];

ile diziyi genişletmeye çalıştığımızda iki durum ortaya çıkabiliyor. Birincisi eğer boş bellek alanı varsa bu alanlar a'nın yanında oluşturuluyor. Eğer a'nın yanında boş bellek alanı yoksa ya da herhangi bir şekilde a'nın sağında bir dizi varsa sıfırdan bellek ayrılıyor. Ve a dizisi yeni ayrılan yere kopyalanıyor. Bu şekilde değil miydi :)

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

Belki tam olarak anlatmak istediğinizi anlamamış olabilirim. Ama bana sanki bu örnekte birincisinin aynısı gibi geliyor. Yani a'ya yeni değerler eklediğimizde gene en sondaki assert ifadesinin geçerli olup olmayacağı konusunda D dili bir garanti vermez. Değil mi  :huh:
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:
Bu sorunun yanıtı 
    assert(b[0] == 15);

ifadesi b[0] 15 olabilir ya da olmayabilir şeklinde değil mi?

Benim bildiğim, eskiden öyleydi ama artık değişti. Bildiğim kural: Uzunluğu artan dilim paylaşımdan ayrılır. Yani a ile b'nin ilişiğinin kesilmiş olması gerekir.

Ama emin olamıyorum; Digital Mars'ta sormamız gerek.

Ali
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Böyle D gibi sürekli değişen yeni diller için kitap yazmak da zor olsa gerek :) Benim okuduğum kitabın basım tarihi Haziran 2010.

(Diğer arkadaşlara bu konuyu görsel olarak göstermek için Tuxpaint'de grafikler hazırlıyordum. Olan o grafiklere oldu! :-D )

Google gibi şirketlerde çalışan bazı mühendislerin neden  beyaz yazı tahtalarını kullandığını daha iyi anlıyorum. Keşke yazdığımız grafik, karalamaları da bilgisayara aktarmanın kolay bir yolu olsaydı.
Bu mesaj erdem tarafından değiştirildi; zaman: 2011-04-11, 16:16.
acehreli (Moderatör) #6
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ı
Kitap TDPL, değil mi? Hangi örneğe baktığını söyler misin.

Beyaz tahtaya yazılanı kağıda geçiren tahtalar var. Ben Bahçeşehir Üniversitesi'nde görmüştüm. :) Ama el yazısını olduğu gibi geçiriyor.

Ali
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Kitap TDPL, değil mi? Hangi örneğe baktığını söyler misin.
Evet.

Bu örnek Diziler Arrays, Associative Arrays, and Strings konusunda Dizilerin Genişlemesi Expanding diye bir başlık. Bu palindrom örneğinden hemen sonra.. Tam olarak 4.1.9 numaralı konu 103, 104 ve 105. sayfalar. Hatta 105.sayfada a ve b'nin bellekte aldığı şekli gösteren bir şekil Figure 4.4 (benim tuxpaint'te çizmeye çalıştığım :rolleyes: )  var.

acehreli:
Beyaz tahtaya yazılanı kağıda geçiren tahtalar var. Ben Bahçeşehir Üniversitesi'nde görmüştüm. :) Ama el yazısını olduğu gibi geçiriyor.

Eğer tahtada yazılanları bilgisayara da aktarabiliyorsa tam benlikmiş.

Ama fiyatlarını görünce ufak bir beyaz tahta da benim işimi görür gibi gözüküyor :)
Bu mesaj erdem tarafından değiştirildi; zaman: 2011-04-12, 09:18.
acehreli (Moderatör) #8
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:
acehreli:
Kitap TDPL, değil mi? Hangi örneğe baktığını söyler misin.
Evet.

Bu örnek Diziler Arrays, Associative Arrays, and Strings konusunda Dizilerin Genişlemesi Expanding diye bir başlık. Bu palindrom örneğinden hemen sonra.. Tam olarak 4.1.9 numaralı konu 103, 104 ve 105. sayfalar. Hatta 105.sayfada a ve b'nin bellekte aldığı şekli gösteren bir şekil Figure 4.4 (benim tuxpaint'te çizmeye çalıştığım :rolleyes: )  var.

(Arama yaparken kitabın kaçak kopyalarına da rastladım.)

Ne kadar karmaşık bir konu!

Kendi katıldığım "D array expansion and non-deterministic re-allocation" diye bir konu bile olmuş:

  http://lists.puremagic.com/pipermail/digitalmars-d/2009-No…

O tartışmaları tabii ki hatırlıyorum ama sonuçta dizilerin bu konularda güvenli olduklarını hatırlıyordum. Yani "uzunluğu değişen dilim paylaşımdan ayrılır" sanıyordum. Değilmiş. Şurada bazı örnekler var (kurallar ~= için de geçerli):

  http://digitalmars.com/d/2.0/arrays.html#resize

Aynen Erdem'in söylediği gibi. Tehlikeli... Yukarıdaki bağlantıda "paylaşımı ayırmak istiyorsanız kendiniz .dup'u çağırın" diyorlar. Peki. Dikkat ederiz. :)

Erdem, konuyu açtığın için teşekkürler. Ben bir kere daha öğrendim. Aynı konuyu bir kaç ay sonra yine açalım da yine öğrenelim! :D

Tuxpaint'de grafikler hazırlıyordum

O bir resim çizme programı değil mi? Kutuları tutup kaydırıp oklar filan çizebiliyor mu? Öyle bir programsa değiştirmesi kolay olur. Ama değiştirmene gerek de yok... :) (Baktım; bende "OpenOffice.org Drawing" var.)

Ali
erdem (Moderatör) #9
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
O bir resim çizme programı değil mi? Kutuları tutup kaydırıp oklar filan çizebiliyor mu? Öyle bir programsa değiştirmesi kolay olur. Ama değiştirmene gerek de yok... :) (Baktım; bende "OpenOffice.org Drawing" var.)

Evet çocuklar için resim çizme programı! :-D Ama Inkscape gibi karmaşık bir programı ilk kez deneyince dedim en iyisi bu program basit görünüyor onunla çizeyim.

O zaman OO Drawing programına bir bakayım :-)
Bu mesaj erdem tarafından değiştirildi; zaman: 2011-04-12, 10:47.
acehreli (Moderatör) #10
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ı
Ben OO Drawing'i kullanmıyorum ama; sonra beğenmezsen beni suçlama. :) Baktım; menüde o var.

Bu programlara alışınca çok hızlı çalışılabiliyor. Bizde bir arkadaş var; bana bir tasarımı anlatırken bile bir yandan ekranda kutucukları hareket ettirip birbirlerine bağlıyor. (Ben gelemem öyle sıkıntıya. :D)

Ali
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 981 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yukardaki örneği erinmedim çizdim :)

[Resim: http://i53.tinypic.com/28u075e.jpg]

İlkönce a dizi nesnesini oluşturduk. Bir tane de b dizi nesnesi oluşturup sende aynı yeri göster diyoruz. Burada en baştaki soruda [5,17] eklediğimizde 2 durum oluşabiliyor.

Birincisi: Eğer a'nın gösterdiği yerin sağ tarafında başka dizi nesnesi yoksa ve yeterli alan varsa yerinde genişleyebiliyor. O zaman a'nın 2'yi gösteren hayali ok 17'ye kaymış oluyor. Örneğin burada c isimli ve [2,17] aralığını gösteren hayali bir c dizi nesnesi olsaydı her halükarda yeni bellek alanı ayrılması gerekecekti.

[Resim: http://i56.tinypic.com/2iglzr8.jpg]

İkinci durumda eğer a'nın gösterdiği yerin yanında yeterli boş alan yoksa (ne kadar doğru olur bilmiyorum ama ben o kesikli çizgiyi bir bellek bloğu gibi düşünüyorum) a'nın içeriği tamamen kopyalanarak yeni bellek alanı ayrılıyor.  (resim tam görüntülenmiyorsa resme bak diyebilirsiniz)
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-22, 06:49:24 (UTC -08:00)