August 05, 2013

Küçük bir hata var!

Kanıt olarak gösterdiğim (herhalde uykusuzluktan olsa gerek!) bellek bölgesine (sınıf içindeki memory dizisine) doğrudan erişmekten başka bir şey değilmiş...:)

Ancak değişen bir şey yok, dilimler görevini yapıyor:

   /* dilimlerin test dizgesini değil de ayrılan
    * bellek bölgesini işaret ettiğinin bir kanıtı:
    */
   (*dizin[1]).dilim[0] = '.';
   (*dizin[2]).dilim[0] = '.';
/* Çıktısı:
 46 117  46 105 114  86 101 114 .u.irVer
*/

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

August 05, 2013

'free()' tamam, sıcak sıcak...:)

 bool free(char[] slice) {
   auto düğüm = binarySearch(slice);
   auto öncekiDüğüm = (*düğüm).önceki;

   if(düğüm == null) return false;

   (*düğüm).boşta_Mı = true; // düğümü boşa çıkar...

   if((*öncekiDüğüm).boşta_Mı) {
      auto a = (*öncekiDüğüm).konum;
      auto b = a;
           b += (*düğüm).dilim.length;
           b += (*öncekiDüğüm).dilim.length;

      (*öncekiDüğüm).dilim = memory[a..b];
      (*düğüm).dilim.length = 0;
   } /* Eğer önceki bölüm boşsa, bununla birleştir ve
      * silinen düğümün dilim uzunluğunu 0 yap...
      */

   if((*düğüm).sonraki != null) {
     (*öncekiDüğüm).sonraki = (*düğüm).sonraki;
   } else {
     (*öncekiDüğüm).sonraki = null;
   } /* Eğer sonraki bölüm varsa, önceki ile birleştir;
      * yoksa tıpkı silinen düğüm gibi null yap...
      */

   return true;
 }

Lütfen karışık demeyin, yaptığı iş çok çok basit...

Eğer üst komşusu (dizi mantığıyla önceki bölüm) boş ise o zaman yanına gelen komşu ile bunun birleşmesinin (aslında önceki dilimi komşu kadar genişletmenin) hiç mahsuru yok. Zaten bu bölüm işaretçisi ile tamamen silineceğinden artık boş bir dilime çevrilir ve aradaki bağ kopartılır...

Bu işlev çalışıyor; yine de henüz tamamlanmış değil. Çünkü bir de üst komşusu boş olmaması durumunda alt komşusuna bakması gerekiyor. Özetle temel olarak yapacağı iş:

Boş olan komşu ile bütünleşip kendisini bağdan kopartmak. Tabi bütün bunları yapabilmek için, mecburen yapıya 2 eleman daha ekledim:

Alıntı:

>
> struct Düğüm {
>   size_t konum;
>   char[] dilim;
>   Düğüm * önceki, sonraki;
>   bool boşta_Mı; // false (boşta değil)
> }
> ```

>

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

Ali hocam değerli düzeltmelerin için çok teşekkür ederim. En kısa zamanda uygulayıp yeni eklemeler yapacağım...

Aslında boşuna vakit kaybettiğimizi düşünmüyorum değil ama bir şeyler de öğreniyoruz hani...:)

Çünkü gereksiz bellek işgal ediyoruz; şöyle ki:

Dilim haricinde (sanırım o da 2 işaretçiden oluşan bir yapı?) 2 tane daha işaretçi kullanıyorum. Yetmiyor, acizlikten ve kötü programlama mantığı kurduğumdan olsa gerek 2 tane de yardımcı değişken (bool'u kaldırabilirim!) kullanıyorum. Etti mi:

2 x 2 + 2 = 6 (hatta x2, doğrudan kullanmadığımız bellek alanları)

Yani bunlar 64 bit değişkenler olsa (8 x 12) kabaca, 100 byte'lık alanı sınırlı bir bellek bölgesini ayırmak için kullanıyoruz. Oysa basit her zaman daha verimli olsa gerek. Belki sıradan bir malloc() işlevinin gerçekleştiremeyeceği amaçlara çevirirsek faydasını görürüz...

Ne dersiniz?

Örneğin yakında yapıya (T) parametresini ekleyip tür şablonu kullanmayı düşünüyorum. Belki bellek bölgesini immutable(char[]) olarak işaretleyip read-only özelliği katabiliriz? Tabi veriler aktarılırken bir immutable kaynaktan gelmesi gerekecek. Bilemiyorum, şimdilik aklıma gelen tek fikir...:)

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

August 05, 2013

Heyecanlı! :)

Küçük notlar:

  • D'de C'den tanıdığımız -> işlecinin yerini de . (nokta) işleci alıyor. '(*düğüm).sonraki' yerine 'düğüm.sonraki' de yazabilirsin.

  • Sondaki if koşuluna gerek yok, değil mi? ;) Onun yerine tek satır:

   (*öncekiDüğüm).sonraki = (*düğüm).sonraki;

Ve tabii bir önceki notuma uygun olarak da:

   öncekiDüğüm.sonraki = düğüm.sonraki;

Ali

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

August 05, 2013

Bir not daha: Yapılarda farketmez ama null karşılaştırmasını == ve != ile değil, 'is' ve '!is' ile yapmaya alışmak iyi olur:

   if (düğüm is null)

Yani, güvenlik için değil de tutarlı olmak için çünkü sınıflarda == ve != derleme hatasına neden oluyor. :)

Ali

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

August 06, 2013

Alıntı (Salih Dinçer):

>

bir şeyler de öğreniyoruz hani...:)

Doğru. :)

Alıntı:

>

sıradan bir malloc() işlevinin gerçekleştiremeyeceği amaçlara çevirirsek faydasını görürüz...

En önemlisi o. İş öğrenmek olunca farketmez, her şey yapılabilir ama sonuçta hangi soruna çözüm getirildiği de bilinmeli. Örneğin, dilim gibi işleyen ama bütün işini içindeki bir dilime havale eden bir tür herhalde pek işe yaramaz.

Öğrenmeye devam... :)

Ali

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

1 2 3
Next ›   Last »