July 05, 2012

Tam olarak doğru anlamışsın. Aslında işlemciler çok hızlı olduğu için her rasgele üretilen sayıya kadar kaç tane asal sayı olduğunu saydırıyorum. Böylece işlemci defalarca ve defalarca hep aynı işlemi yapıyor. Ancak burada önemli bir sorun var:

İkinci döngü şak diye kuruluyor. Dolayısıyla bir yandan stack'a veri eklesem de arkadaki thread'lar çalışmaya devam edecek. Öyle bir şey yapmalı ki stack yine dolduğunda bir event oluşsun ve yeni thread'lar meydana gelsin. İşte bu beni de aşıyor...:)

'Önemli !!!' Az önce yukarıdaki kodu 64 bit sistemde ve emin olmak niyetiyle "-m64 -release" parametreleri ile derledim ve binary dosya çalıştırılamadı. Herhalde koşullu programlama ile ilgili bir şeyler karışmış olmalı dedim kendi kendime. Sonra import bölümündeki kütüphaneler ile birlikte koddaki bu bölümü kaldırdım ve yine aynı hata! Sanırım -m64'de bir şeyler karışıyor ama farklı binary dosyası oluştuğuna eminim. Çünkü -m32 ile -m64 arasında 100 KB. bir fark var. Bu arada sistem Ubuntu, DMD 2.059 ve 'main()' en son şu şekildeydi:

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++) {
       asalSay(index, stack.fetch);
   }
}

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

July 06, 2012

Benim kendimce kodlamada gördüğüm eksiklikler;

** Yığıt sınıfının bellek üye degişkenine program içinden erişim tehlikeli. Örneğin konum değeri beş olduğu bir durumda ben program içinden bellek dizisine erişip bir elemanı silersem Yığıt nesnesinin tutarlılığı bozulmuş olacaktır.

** 'bellek = bellek[0..0];' kısmını anlamadım Salih, buradaki amaç bellek dizisini boşaltmak mı?

** 'if(temizle) goto atla;' temizle metodu her zaman true döndürdügüne göre bu satırın altındaki kodlar hiç çalışmayacaktır. (goto deyiminin işlemi atla: etiketine gönderdiğini varsayıyorum.) Ayrıca bu bölümde oluşturulan yığıt ekrana hiç yazılmıyor?

Benim görebildiklerim bunlar, elbette başka arkadaşlar daha başka yönlerden kodu inceliyip başka tavsiyeler verebilir. Bunların dışında bence güzel olmuş eline sağlık Salih.

Alıntı (Salih Dinçer):

>

Çünkü public gibi davranıyor.

Bu durum sınıf ile test kodunun aynı modülde olmasından kaynaklanıyor. Eger sınıfı başka bir modüle taşırsan o zaman erişim belirteçlerinin etkisini görebilirsin.

Alıntı (canalpay):

>

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

Hatırladın mı Can havalanı binasına baktıgımızda ne kadar güzel ve büyük bir yapı diye konuşmuştuk. İlk bakışta büyük bir kod parçası sizi ürkütebilir ancak o büyük kod parçasıda tek bir satır ile başlayıp bu hale gelmiştir. Uzun lafın kısası kodlar gözünü korkutmasın al yapıştır bir metin editörüne (veya Divid'e :)) sonra yazıcıdan çıktı al ve bir derleyici gibi giriş metodundan başla ve devam et, o sana yolu gösterecektir ;)

Alıntı (Kadir Can):

>

ama biz küçükken hata atıyoruz.

Kadir düzeltme için teşekkürler. Bu küçük ve basit bir metot bile insanın nasıl hatalı kod yazabilecegine çok güzel bir örnek oldu. Ben bu metodun çıktısını alıp işyerimdeki panoma çiviledim ;)

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

Kadir, Clear() metodunu güzel gerçekleştirmişsin. Özellikle 'yigin = yigin.init;' kısmı benim çok hoşuma gitti. Doğrusu ben bu işlem için bir döngü kullanırdım sanırım, bu çok daha temiz ve güzel bir kodlama olmuş. Yedekleme konusunda ise ben şöyle düşünüyorum; Yıgın sınıfı bir hizmet sınıfı amacı geliştiriciye yıgın yapısını kullanabilme imkanını daha kolay bir şekilde sağlamak. Ayrıca yıgın sınıfının temel görevi mevcut yıgın yapısının yönetimini sağlamak. Bundan dolayı geliştirici yıgın sınıfının mevcut halini saklamak istiyorsa bu onu ilgilendirmeli yıgın sınıfı olarak bizi degil. Yani en basit manada Clear() metodu yıgını temizlemeli, verilerin durumu onların esas sahibi olan geliştiriciyi ilgilendirir bizi degil ;)

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

July 06, 2012

Alıntı (Salih Dinçer):

>

Öyle bir şey yapmalı ki stack yine dolduğunda bir event oluşsun ve yeni thread'lar meydana gelsin.

Salih, anladığım kadarıyla bazı işlerin dinamik olarak yapılmasını istiyorsun. Dinamik olarak yeni diziler oluşturup bunları rastgele dolduran ve bir listeye ekleyen bir kod hazırladım. Belki bir yardımı olur diye düşünüyorum. Senin belirttigin gibi her dizi dolduğunda yeni bir dizi hazırlanıp onun üzerinde çalışılıyor.

import std.stdio;
import std.random;
import std.container;

void main()
{
   SList!(int[]) diziListe;

   for (int i = 0; i < 100; ++i)
   {
       // Benim için yeni bir dizi hazırla
       // int tipinde ve 5 elemanlı olsun
       int[] dizi = new int[5];

       // Yeni diziye değerleri doldur.
       for (int j = 0; j < 5; ++j)
       {
           dizi[j] = uniform(0, 100);
       }

       // Dolu diziyi kaybetmemek için
       // listeye ekle
       diziListe.insert(dizi);
   }

   // Listeyi yazalım, bakalım neler varmış.
   foreach (dizi; diziListe)
   {
       writefln("-> %s", dizi);
   }
}

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

July 06, 2012

Alıntı (zafer):

>

Yığıt sınıfının bellek üye degişkenine program içinden erişim tehlikeli. Örneğin konum değeri beş olduğu bir durumda ben program içinden bellek dizisine erişip bir elemanı silersem Yığıt nesnesinin tutarlılığı bozulmuş olacaktır.
Aslında bu yazdığım kodlar deneme kodu ve senin yazdığından farklı olarak konum değişkenini kullanmadan ters mantıkla çalıştırmayı denedim. Denemelerimden biri de 'private' olarak işaretlenmiş bir üyeye neden erişebildiğim hakkındaydı. Zaten onu da modül mevzusuna bağlamışsın. Yoksa tutarsızlık olmaması için özellikle 'temizle()' işlevini gerçekledim.

Alıntı (zafer):

>

'bellek = bellek[0..0];' kısmını anlamadım Salih, buradaki amaç bellek dizisini boşaltmak mı?
Kadir .init ile temizlemiş ve bunu bilmiyordum. Ben ise 0 boyutlu bir dilim göndererek yaptım. İlginçtir konferansta bu .init olayını anlatmadım. Asıl eksiklik bu olmalı...:)

Alıntı (zafer):

>

'if(temizle) goto atla;' temizle metodu her zaman true döndürdügüne göre bu satırın altındaki kodlar hiç çalışmayacaktır. (goto deyiminin işlemi atla: etiketine gönderdiğini varsayıyorum.) Ayrıca bu bölümde oluşturulan yığıt ekrana hiç yazılmıyor?
Dediğim gibi bunlar bir deneme tıpkı devam eden satırlardaki lock olayı gibi.

Ek: Bu arada kodları 64 bitte derleyebilen oldu mu? Belki de benim sistemde bir sorun var...:(

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

July 06, 2012

Alıntı (zafer):

>

Salih, anladığım kadarıyla bazı işlerin dinamik olarak yapılmasını istiyorsun. Dinamik olarak yeni diziler oluşturup bunları rastgele dolduran ve bir listeye ekleyen bir kod hazırladım. Belki bir yardımı olur diye düşünüyorum. Senin belirttigin gibi her dizi dolduğunda yeni bir dizi hazırlanıp onun üzerinde çalışılıyor.
Teşekkürler,

Aslında mesajlaşarak paralel programlama olanaklarını kullanarak event mantığını oturtmak istiyorum. Çünkü artık çevremizdeki bir çok şey (-bknz. Action Script) bunun üzerine çalışmakta. Örneğin spawn() işlevine benzer bir kurucu işlev ile klavyeden stack'a veri aktaran thread olacak. Aynı zamanda stack'daki veriyi düzenli aralıklarda çeken bir uzunİşlev (asalSay gibi) çalışacak. Şimdi mesele şu:

Arka planda örneğin birer deste veriyi stack'dan alıp işlerken ben klavyeden stack'ı doldurabilmeliyim ve stack küçülürken bir şeyler karışmasın. Hatta kuyruktaki tüm görevler bittiğinde uzunİşlevi tetikleyecek; stack'a veri girişiyle meydana gelen başka bir event olmalı. Bu event'lar birbirleriyle çok güzel anlaşarak çalışmalı. Tıpkı mesajlaşarak yaptığımız paralel programlamadaki posta kutusu mantığı gibi.

Bunlar teorik olarak mümkün görünüyor...:)

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

July 06, 2012

Alıntı (Salih Dinçer):

>

Bunlar teorik olarak mümkün görünüyor...:)

Pratik olarakta mümkün tabi ki. Ancak senin bahsettigin gibi sen klavyeden giriş yaparken başka bir işlemin yıgından bilgi alması yıgın yapısına uygun olmadıgı gibi sadece bir kaos yaratacaktır.

Benim anladıgım kadarıyla aslında senin istedigin yapı için kuyruk (queue) (http://e-bergi.com/2008/Eylul/Soyut-Veri-Yapilari) yapısı daha uygun görünüyor. Bir incele işini görüyorsa bir kuyruk sınıfı yazmaya başla bizde yardım ederiz ;)

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

July 07, 2012

Alıntı (zafer:1341472287):

>

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);

Bunun nedeni birisinin işaretli diğerinin işaretsiz tür olması. Altın ve pis kural: İfadenin içinde bir işaretsiz tür olduğunda bütün ifade işaretsiz olur. :) O yüzden int iken -1 olan konum ifade size_t olduğunda size_t.max olarak kullanılıyor.

Şuradaki "Aritmetik Dönüşümler" başlığına hızlıca göz atmanı öneririm:

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

Tabii konum'u size_t yaptıktan sonra artık -1 ile de başlatamazsın çünkü o da size_t.max olarak ilklendirir.

Ek olarak, program size_t'nin 64 bitlik ortamda 64 bit olması nedeniyle bende derlenmedi.

Alıntı:

>
>     bool empty() const
> ```


dmd programlarını -property seçeneği ile derlemeni öneririm. (Ve -w ile de.) Öyle yapınca yukarıdaki işlevin (ve front()'un da) @property olarak işaretlenmiş olması gerektiğini söylüyor. Çünkü aslında foreach onları parantezsiz olarak çağırıyor.

Ali

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

Alıntı (Salih Dinçer:1341517706):

>

64 bit sistemde ve emin olmak niyetiyle "-m64 -release" parametreleri ile derledim ve binary dosya çalıştırılamadı.

64 bitlik dmd ile derleyince bir sorun yok. (32 bitlik dmd ile denemedim.)

Ali

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

July 08, 2012

Alıntı (acehreli:1341661472):

>

dmd programlarını -property seçeneği ile derlemeni öneririm.

Ali, property bilgisi için teşekkürler ama benim gerçekte ögrenmek istedigim empty() metodunu dış dünyaya nasıl kapatabilirim. Yani empty() aralık işlemlerini gerçeklemek için gerekiyor. Bundan dolayı empty()'nin sadece bu gerçeklemede kullanılması gerektigini ve dışarıdan kontrolsüz erişime kapalı olması gerektigini düşünüyorum. Konuya yanlış bir açıdan mı bakıyorum yoksa?

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

July 09, 2012

Alıntı (acehreli):

>

Eğer InputRange ise o üç işlevi sunmuş olması gerekir. İsteyen istediği gibi kullanabilmeli.

Ali aralıklar konusunu tam olarak bilmiyorum dolayısıyla yanlış düşünüyorda olabilirim. Baştan bunu belirttikten sonra şöyle devam edeyim. empty(), popFront() ve front() işlemlerinin amacının sınıfa aralık olarak çalışabilme olanagı sağladıgını düşünüyorum. İsteyen istedigi gibi kullansın derken örneğin birisi yanlışlıkla popFront()' u çagırıp aralıgı daraltma gibi bir durum olabilir mi?

Aslinda özet olarak benim anladıgım bu metotları hiçbir şekilde kısıtlama (private) işaretleme durumumuz yok. Bu doğru mu? Ben bir sınıf yazarı olarak bu metotları kendime saklama hakkına sahipmiyim? Biraz bencil miyim yoksa :)

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