Thread overview
string[] nan değeri var mı ?
Feb 02, 2013
huseyin
Feb 02, 2013
Salih Dinçer
Feb 03, 2013
huseyin
February 02, 2013

bir string[] i nasıl boşaltabiliriz döngü ile silme dışında alternatif var mı?

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

February 02, 2013

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;

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

February 02, 2013

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

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

February 02, 2013

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

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

February 02, 2013

Bir de şu var:

   test = null;

Ali

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

February 03, 2013

Alıntı (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

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

Alıntı (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:

Alıntı:

>

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

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

February 02, 2013
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

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