Forum: Ders Arası RSS
string[] nan değeri var mı ?
Avatar
huseyin #1
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: string[] nan değeri var mı ?
bir string[] i nasıl boşaltabiliriz döngü ile silme dışında alternatif var mı?
Huseyin
Avatar
Salih Dinçer #2
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sonuçta bu bir dizi ve hatırladığım kadarıyla bunun iki yolu var...

İlki aşağıdaki kodda gizlediğim satır ve diğeri de altındaki:
  string[] test = [ "Hello", "World", "and", "Universe" ];
           test = writeln();
           //test = test[0..0]; /* Başından itibaren 0 adet dilimle!
           test = test.init;//* Varsayılan değerine döndür */
           test = writeln();
Yukarıda dizinin boyutu ne olursa olsun bir döngüye sokulmadan ve doğrudan işaretçi arimetiği ile dizi küçültülür. Muhtemelen .init de dilimlemek de aynı işi yapıyor olmalı. Ayrıca dilersen herhangi bir dizgeyi (string) aynı şekilde temizleyebilirsin:
string merhaba = "Merhaba Dünya ve Evren";
       merheba = string.init;
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #3
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ı
Bir de şu var:
    test = null;
Ali
Avatar
zekeriyadurmus #4
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
Aşağıdaki şekilde dizinin uzunluk değerini de değiştirebilirsiniz.

test.length = 0

Hem bu sayede diziye yeni eleman eklemediğiniz sürece eski elemanlara erişebilirsiniz.

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #5
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ı
zekeriyadurmus:
Hem bu sayede diziye yeni eleman eklemediğiniz sürece eski elemanlara erişebilirsiniz.

Ona güvenilebilmesi için elemanlara başka referanslar olması gerekir.

Ama .ptr'nin değişmediği konusunda haklısın:

    writefln(".ptr: %s, .capacity: %s", dizi.ptr, dizi.capacity);
    dizi.length = 0;
    writefln(".ptr: %s, .capacity: %s", dizi.ptr, dizi.capacity);

.ptr: 7FAE3C57AF88, .capacity: 5
.ptr: 7FAE3C57AF88, .capacity: 0

Ancak, görüldüğü gibi .capacity'nin değeri 0 oluyor. O değerin özel anlamını tam da geçen gün kitaba eklemiştim:

  http://ddili.org/ders/d/dilimler.html

O sayfada capacity'nin geçtiği başlığın altında şöyle demişim:

Değeri 0 ise bu dilim en uzun dilim değil demektir. Bu durumda yeni bir eleman eklendiğinde dilimin bütün elemanları başka yere kopyalanırlar ve paylaşım sonlanır.

Yani, eski elemanlara bu dilim yoluyla erişilemez çünkü .length arttırıldığında başka yere taşınacaktır.

Ali
Avatar
zekeriyadurmus #6
Kullanıcı başlığı: Talha Zekeriya Durmuş
Üye Eki 2012 tarihinden beri · 701 mesaj · Konum: Samsun/Türkiye
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Uzun vadeli güvenilmez evet ama bazı durumlarda güvenmekten zarar gelmez :)

Kendi sistemimde şu şekilde kullandım.

override Command getMethod(string m, dataManagement dM){
    switch(m){
    case "str": return new RhString(to!string(value));
    case "length": return new RhInt(value.length);
    case "reverse": reverse(value); return this;
    case "pop": value = value[0..$-1]; return value[$];
    case "shift": value = value[1..$]; return *(&value[0] - 1);
    default:
        if (m in functions) return new dFunction(functions[m], this);
        else throw new Exception(type ~ " tipine ait " ~ m ~ " alt fonksiyonu bulunmamaktadır.");
}
assert(0);
}

Şeklinde pop ve shift işlemlerinde önce değeri diziden attım daha sonra ise return ettim. Ek bir değişken tanımlamadım. Ama değeri bir değişkene atıp daha sonra dilimleme yapıp return olarak da tanımlanan değişken gönderilirse daha yavaş oluyor. Pop için çok ek birşey gerekmezken shift için adresi alıp 1 çıkartıp adrese erişmek çok daha hızlı.

Zekeriya
Bilgi meraktan gelir...
acehreli (Moderatör) #7
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ı
return *(&value[0] - 1);

İşine yaradığına sevindim ama altını çizmek gerek: Teknik açıdan tanımsız davranıştır çünkü ilk elemandan önce eleman yok. Tabii dilimlerin nasıl gerçekleştirildiklerini bildiğimiz için işe yarayacağından eminiz. :)

Ve nasıl olsa yalnızca dönüş değeri olarak kullanılıyor. Yani artık var olmadığını bildiğimiz elemana bir referans da kullanmıyoruz. Öyle bir tehlike de yok...

Ali
Avatar
huseyin #8
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
acehreli:
Bir de şu var:
    test = null;
Ali

Evet ben bunun mümkün olduğunu düşünüyordum ancak referansta görmeyince biraz hayal kırıklığı olmuştu :)
Teşekkürler
Huseyin
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-19, 04:21:54 (UTC -08:00)