July 05, 2012

Ben onu tamamen unutmuşum.Artık telafi edecek bir kod yazmam gerekir. :)
Push() işlevi hatalı gibi geldi.konum sürekli yigin.length'ten küçük olmalı, yoksa farklı bir şey mi var?

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

July 05, 2012

Dolu dolu bilgi var, nereden başlayacağımı bilemiyorum doğrusu, en iyisi en baştan başlamak sanırım.

Alıntı (acehreli):

>

Aslında Push()'ta ve Pop()'ta da enforce kullanabilir.

Ali haklısın amacım sadece daha fazla olanağı bir arada gösterebilmekti.

Alıntı (acehreli):

>

Eğer Yığın bir topluluksa, foreach onun üzerinde değil, onun bir aralığı üzerinde ilerlemelidir.

Bu maddeyi biraz daha açmanın çok faydalı olacagını düşünüyorum. Aralıklarla yeni yeni ilgenen biri olarak foreach üzerinde ilerlemek ile aralık üzerinde ilerlemek arasındaki farkı anlamadım?

Alıntı (Salih Dinçer):

>

Öyle ki bir elektronikçi olarak Zafer'i kıskandım şimdi! Çünkü benim yapmam gerekirdi...:)

Salih aramızda ayrı gayrı yok, senden daha güzel örnekler bekliyoruz. empty() konusuna gelince aslında o empty() metodu halka açık kullanım için tasarlanmadı. O empty() metodu aralık olanağını gerçekleştirmek için kullanılan empty, popFront, front üçlemesinin bir parçası ve bu şekilde kullanım tehlikeli çünkü yıgını bitiriyor.

Aslında şöyle bir bakıyorum da bu örnek bize erişim belirteçlerinin ne kadar değerli olduğunu bir kez daha gösteriyor. Erişim belirteçlerini kullanarak olası bir çok hatayı baştan önleyebilecegimiz gibi terside mümkün tabi.

Ben yigin sınıfını başka bir module taşıyıp erişim belirtecini private olarak işaretledim. Bu erişimi kısıtladı ve dışarıdan kullanımı iptal etti ancak bu yapı aralık olanağınında erişimini engelledi. Buna nasıl çözüm bulabilirim?

Alıntı:

>

Error: class yigin.Yigin!(string).Yigin member empty is not accessible

Son olarak Kadir'e söylemiştim ama sanırım pek ilgisini çekmedi. Sözleşmeli programlamanın invariant() olanağını bu sınıfta gerçekleştirmeye çalıştım. Yalnız bunu yaparken şöyle bir olay ile karşılaştım. invariant() bloğunda kullandığım assert() ifadesinde aşağıdaki yazımı bir türlü çalıştıramadım.

Alıntı:

>

assert(konum < yigin.length);

Sonunda çözümü şu şekilde gerçekleştirdim. Ancak neden çalışmadığını anlayamadım. Siz ne dersiniz?

Alıntı:

>

int yiginKapasitesi = yigin.length;
assert(konum < yiginKapasitesi);

Ayrıca Salih'in belirttigi "Yigin dolu" hatasını düzelttim. Salih'e teşekkürler.

import std.stdio;
import std.exception;

class Yigin(T)
{
   private int konum;

   private T[] yigin;

   public this(int kapasite)
   {
       enforce(kapasite >=0, "Yigin buyuklugu negatif olamaz!");
       yigin.length = kapasite;
       konum = -1;
   }

   invariant()
   {
       int yiginKapasitesi = yigin.length;
       assert(konum < yiginKapasitesi);
   }

   public void Push(T)(T deger)
   {
       if (konum < yigin.length)
       {
           throw new Exception("Yigin dolu");
       }

       konum++;
       yigin[konum] = deger;
   }

   public T Pop()
   {
       if (konum == -1)
       {
           throw new Exception("Yigin bos");
       }

       return yigin[konum--];
   }

   bool empty() const
   {
       // Aralıktaki eleman mevcudunu denetler.
       // true ise eleman bitmiştir.
       return (konum < 0);
   }

   void popFront()
   {
       // Bir sonrakine geçmek, mevcut eleman
       // sıramızda her defasında sondan bir tane
       // dışarı çıkarmak
       --konum;
   }

   string front() const
   {
       // ilgili konumdaki elemanı bize verir
       return yigin[konum];
   }
}

void main()
{
   Yigin!(string) stack = new Yigin!(string)(10);

   stack.Push("ben");
   stack.Push("bir");
   stack.Push("D");
   stack.Push("Dili");
   stack.Push("yigin");
   stack.Push("sinifiyim");

   foreach (kelime; stack)
   {
       writeln("Deger : ", kelime);
   }

}

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

July 05, 2012

Alıntı (Kadir Can):

>

Ben onu tamamen unutmuşum.Artık telafi edecek bir kod yazmam gerekir. :)

Sorun değil Kadir, ben eklemiş oldum. Telafisini bekliyoruz artık. ;) Küçük bir öneri belki Yıgın sınıfına Clear() isimli bir metot ekleyerek kullanıcı istediginde mevcut yıgını temizlemesini sağlayabiliriz.

Alıntı (Kadir Can):

>

Push() işlevi hatalı gibi geldi.konum sürekli yigin.length'ten küçük olmalı, yoksa farklı bir şey mi var?

Ben bir hata göremiyorum ama istersen birlikte tekrar bakalım;

   public void Push(T)(T deger)
   {
       if (konum < yigin.length)
       {
           throw new Exception("Yigin dolu");
       }

       konum++;
       yigin[konum] = deger;
   }

Evet, konum degişkeni burada Yıgın sınıfının üye degişkeni ve görevi yıgın üzerinde bulunulan konumu göstermek. Yıgın yapısı için biz bir dizi kullandık, dizimiz sıfırdan başlıyor ve kullanıcının girdigi değer kadar bir büyüklüğe sahip. Örneğin kullanıcı on elemanlı bir yıgın oluşturmak isterse bizim yıgın dizimiz en fazla on elemanlı oluyor.

Bu duruma göre konum degişkeni yıgın dizisi üzerindekl geçerli konumları göstermesi gerekiyorsa her zaman yigin dizisini boyutundan küçük olmak zorunda.

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

July 05, 2012

Alıntı (zafer):

>

Salih aramızda ayrı gayrı yok, senden daha güzel örnekler bekliyoruz. empty() konusuna gelince aslında o empty() metodu halka açık kullanım için tasarlanmadı. O empty() metodu aralık olanağını gerçekleştirmek için kullanılan empty, popFront, front üçlemesinin bir parçası ve bu şekilde kullanım tehlikeli çünkü yıgını bitiriyor.
Estağfirullah, aslında bugün senin kodu görmeseydim nasıl bir kod yazardım diye kendi kendime düşündüm. Aşağıdaki gibi bir örnek hazırladım ama hiç aralık işlevlerini dahil etmedim. Henüz aralıklara yeteri kadar hakim değilim ama kesinlikle çok faydalılar. Eğer tamamen anlamayı başarırsam asal sayılarda çok işe yarayacağını düşünüyorum. Sanırım TÜTEV'deki etkinlikte özel olarak, aralıklardan söz etmedik öyle değil mi?

import std.exception, std.stdio;

class Yığıt (T){
   private size_t konum;
   private T[] bellek;

   void yolla(T veri) {
       konum++;
       bellek ~= veri;
   }
   T getir() {
       if(konum) konum--;
       else throw new Exception("HATA(1): YIĞIN BOŞ");
       return bellek[konum];
   }
   bool temizle() {
       konum = 0;
       bellek = bellek[0..0];
       return true;
   }
   bool halaDolu_mu() {
       return konum > 0;
   }
}
void main() {
   with(new Yığıt!int) {
       for(int i; i < 10; i++) yolla(i); // 0'dan 10'a yığına yolla
       konum.writeln("\n^---Yüklenen veri adeti / türü --->", typeid(bellek));
       if(temizle) goto atla;
       do getir.write(", "); while(halaDolu_mu);
       writeln("\n");
   }
atla:
   with(new Yığıt!char) {
       for(char i=65; i < 91; i++) yolla(i); // A'dan Z'ye yığına yolla
       konum.writeln("\n^---Yüklenen veri adeti / türü --->", typeid(bellek));
       do getir.write(", "); while(halaDolu_mu);
       //getir.writeln("\n"); // Taşma durumunda hata verecek...
   }
}

Alıntı (zafer):

>

Ben yigin sınıfını başka bir module taşıyıp erişim belirtecini private olarak işaretledim. Bu erişimi kısıtladı ve dışarıdan kullanımı iptal etti ancak bu yapı aralık olanağınında erişimini engelledi. Buna nasıl çözüm bulabilirim?
Bu arada aklıma gelmişken, ben de 'private' ile ilgili olarak çok ilginç bir sorun ile karşılaştım! Çünkü 'public' gibi davranıyor. Bunu yukarıda denediğim örnekte de görebilirsiniz. Zafer'in kodunda ise Push'lardan sonra şu satırı eklemeniz yeterli:

   stack.konum.writeln;

Herhalde benim DMD'de bir sorun var. Sizde de böyle bir sorun oluyor mu, yoksa ben bir şeylerimi karıştırdım?

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

July 05, 2012

Çok fazla kod ve yazı yazılmış okuyamadım :-)

Alıntı:

>

Bu arada aklıma gelmişken, ben de private ile ilgili olarak çok ilginç bir sorun ile karşılaştım! Çünkü public gibi davranıyor. Bunu yukarıda denediğim örnekte de görebilirsiniz. Zafer'in kodunda ise Push'lardan sonra şu satırı eklemeniz yeterli:
stack.konum.writeln;
Herhalde benim DMD'de bir sorun var. Sizde de böyle bir sorun oluyor mu, yoksa ben bir şeylerimi karıştırdım?

Bir yıl önce dmd'nin bilinen hatalarından biri idi. Şimdi ne oldu bilmiyorum ancak anlaşılan devam ediyor :-)

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

July 05, 2012

Alıntı (zafer):

>
>     public void Push(T)(T deger)
>     {
>         if (konum < yigin.length)
>         {
>             throw new Exception("Yigin dolu");
>         }
>
>         konum++;
>         yigin[konum] = deger;
>     }
> ```

>
> Evet, konum degişkeni burada Yıgın sınıfının üye degişkeni ve görevi yıgın üzerinde bulunulan konumu göstermek. Yıgın yapısı için biz bir dizi kullandık, dizimiz sıfırdan başlıyor ve kullanıcının girdigi değer kadar bir büyüklüğe sahip. Örneğin kullanıcı on elemanlı bir yıgın oluşturmak isterse bizim yıgın dizimiz en fazla on elemanlı oluyor.
>
> Bu duruma göre konum degişkeni yıgın dizisi üzerindekl geçerli konumları göstermesi gerekiyorsa her zaman yigin dizisini boyutundan küçük olmak zorunda.
>
Sabahleyin salim kafayla bakmak üzere bu işlevin doğru çalışmadığını belirtmeliyim. Çünkü son halinde her zaman "Yığın Dolu" hatası alıyorum. Şu an şantiyedeki cabinet rack'ın karşısında olduğum ve dizlerim ağrıdığı (!) için fazla bakamıyorum.

**Dip Not:** Bu arada Ali hocam da bugün dönüyor. Kendisine hayırlı yolculuklar dilerim.

Kolay gelsin...

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

Alıntı (zafer):

>
>     public void Push(T)(T deger)
>     {
>         if (konum < yigin.length)
>         {
>             throw new Exception("Yigin dolu");
>         }
>
>         konum++;
>         yigin[konum] = deger;
>     }
> ```

> Bu duruma göre konum degişkeni yıgın dizisi üzerindekl geçerli konumları göstermesi gerekiyorsa her zaman yigin dizisini boyutundan küçük olmak zorunda.
>
İşte hata burada, konum her zaman yigin dizisinin boyutundan küçük olmalı; ama biz küçükken hata atıyoruz.Yani Push() her çağrıldığında hata atıyor.Aşağıdaki haliyle doğru çalışıyor.

public void Push(T)(T deger)
{
if (konum == (yigin.length - 1))
{
throw new Exception("Yigin dolu");
}

   konum++;
   yigin[konum] = deger;

}


clear() işlevi de aklımda.Hemen başlıyorum. :)

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

Clear() işlevini ekledim; ama şu haliyle biraz masraflı.Aslında sanırım yaptığım olması gerekendi, yani yığını temizlediğimizde elemanların kaybolmaması, sadece kullanıcıyı gösterilmemesi gerekiyor.Bu konuda yorumlarınızı bekliyorum.

import std.stdio;
import std.exception;
import std.conv;

class Yigin(T)
{
   private int konum;
   private T[] yigin;
   private Yigin yedek;

   public this(int kapasite)
   {
       enforce(kapasite >=0, "Yigin buyuklugu negatif olamaz!");
       yigin.length = kapasite;
       konum = -1;
   }

   invariant()
   {
       int yiginKapasitesi = yigin.length;
       assert(konum < yiginKapasitesi);
   }

   public void Push(T)(T deger)
   {
       if (konum == (yigin.length - 1))
       {
           throw new Exception("Yigin dolu");
       }

       konum++;
       yigin[konum] = deger;
   }

   public T Pop()
   {
       if (konum == -1)
       {
           throw new Exception("Yigin bos");
       }

       return yigin[konum--];
   }

   bool empty() const
   {
       // Aralıktaki eleman mevcudunu denetler.
       // true ise eleman bitmiştir.
       return (konum < 0);
   }

   void popFront()
   {
       // Bir sonrakine geçmek, mevcut eleman
       // sıramızda her defasında sondan bir tane
       // dışarı çıkarmak
       --konum;
   }

   string front() const
   {
       // ilgili konumdaki elemanı bize verir
       return yigin[konum];
   }

   public void  Clear()
   {
       yedek = new Yigin!T(yigin.length);
       yedek.yigin[] = yigin[];
       yigin = yigin.init;
   }

   public string  eskiyiDöndür() const
   {
       string sonuç;
       foreach(eleman; yedek.yigin)
       {
           sonuç ~= to!string(eleman) ~ " ";
       }
       return sonuç;
   }
}

void main()
{
   Yigin!(string) stack = new Yigin!(string)(10);

   foreach(sayi; 0..10)
   {
       stack.Push(to!string(sayi));
   }

   foreach (kelime; stack)
   {
       writeln("Deger : ", kelime);
   }

   stack.Clear();

   writeln(stack.eskiyiDöndür());
}

Yığın şablonunu int ile de çağırabilirdim ama deneme kodu olduğu için ne kadar fazla şey görsek o kadar iyidir diyorum. :)

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

July 05, 2012

@Salih;
Şu an için bu kod beni aşıyor, koşut işlemlere gelemedim. :(
Kodlar gayet güzel görünüyor, şu an D.ershane'den çalışıyorum, vaktim olduğunda koda biraz güvenlik eklemeyi düşünüyorum.Bakalım bu sefer güvenlik olanaklarını tamı tamına tasarlayabilecek miyim? :)
Sanırım aslen yapmak istediğin veri giriş çıkışının beklememesi, değil mi?Yani sürekli ekleme ve çıkarma yapılacak, okumalar sırasında da kilitlenecek, bu sayede değişme olmadığı için veri kaybı olmayacak.Doğru mu anlamışım?
Anladığım kadarıyla burada stack boşalana kadar gelen sayıların koşut olarak asal olup olmadığını denetliyoruz, değil mi?

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

July 05, 2012

Kadir, ben de yolda düşünüyorken aklıma koşut işlemler ve sürekli veri pompalanan bir bellek yapısı geldi. Yatmadan bir şeyler kodlayım dedim ve şu aşağıdaki program meydana geldi. Henüz buffer sürekli tazelenmiyor ve kilit işlemini bitirmedim. Ayrıca veriyi sondan değil girdiği sırayla (alıştığımız şekle göre ters) işliyor. İşlemler uzun sürsün diye de basitinden asalları sayan işlev koydum. Şimdi sıra kilitleme işleminde çünkü veri gelirken ve dizi kısalırken işler karışabilir, öyle değil mi?

/*
invertStack.d (05.07.2012)
*/
import std.exception, std.stdio;
import std.parallelism, std.random;

class Stack (T){
   T[] buffer;
   bool lock;

   void push(T data) {
       if (!lock) buffer ~= data;
   }
   T fetch() {
       if(buffer.length == 0) {
           throw new Exception("ERROR(1): STACK EMPTY");
       }
       lock = true;
       scope(exit) lock = false;
       auto temp = buffer[0];
       buffer = buffer[1..$];
       return temp;

   }
   bool clear() {
       buffer = buffer[0..0];
       return true;
   }
   bool isEmpty() {
       return buffer.length > 0 ? true : false;
   }
}
void asalSay(int i, int p) {
   int xSay = 1;

   for(int k = 3; k <= p; k += 2) {
       if(isPrime(k)) {
           xSay++;
       }
   }
   writefln(" # %d numbers between [0 - %d] "
            "of %d primes found... ", i, p, xSay);
}
bool isPrime(int p) {
   if(p % 2 == 0) {
       return false;
   }
   for(int n = 3; n * n <= p; n += 2) {
       if(p % n == 0) {
           return false;
       }
   }
   return true;
}
void main() {
   auto stack = new Stack!int;

   for(int i; i < 100; i++) {
       stack.push(uniform(0, 1_000_000));
   }
   for(int index; stack.isEmpty; index++) {
       auto xTask = task!asalSay(index, stack.fetch);
       xTask.executeInNewThread();
   }
}

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