Forum: Ders Arası RSS
Koşut İşlemler Örneği Çalışmıyor
Kadir Can #1
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Koşut İşlemler Örneği Çalışmıyor
Merhaba arkadaşlar;
Dün koşut işlemler dersini okudum ve bugün de biraz örnek yapmaya çalıştım ama hiçbiri derlenemedi. Bunun üzerine acaba ben mi hata yapıyorum diyerek örnek programları derlemeye çalıştım. Yine hiçbiri derlenemedi. Derleyici ile ilgili bir sorun olabilir mi? Aşağıda kodlar ve derleme hatası var.
import std.stdio;
import std.parallelism;
import std.algorithm;
import core.thread;
 
struct Öğrenci
{
    int numara;
    int[] notlar;
 
    double ortalamaNot() @property
    {
        writeln(numara,
                " numaralı öğrencinin işlemi başladı");
        Thread.sleep(dur!"seconds"(1));
 
        immutable ortalama =
            reduce!((a, b) => a + b)(0.0, notlar) / notlar.length;
 
        writeln(numara, " numaralı öğrencinin işlemi bitti");
        return ortalama;
    }
}
 
void main()
{
    Öğrenci[] öğrenciler;
 
    foreach (i; 0 .. 10) {
        /* Her öğrenciye 80'li ve 90'lı iki not */
        öğrenciler ~= Öğrenci(i, [80 + i, 90 + i]);
    }
 
    auto sonuçlar = taskPool.map!(ö => ö.ortalamaNot)(öğrenciler);
 
    foreach (sonuç; sonuçlar) {
        writeln(sonuç);
    }
}
Hata:
parallel.d(34): Error: template instance map!(__lambda5) cannot use local '__lambda5(__T4)' 
as parameter to non-global template map(functions...)
/usr/local/include/d/phobos2/std/parallelism.d(1974): Error: template instance amap!(__lambda5)
 cannot use local '__lambda5(__T4)' as parameter to non-global template amap(functions...)
parallel.d(34): Error: template instance std.parallelism.TaskPool.map!(__lambda5).map!(Öğrenci[]) 
error instantiating
taskPool.map giriş aralıklarında çalıştığı için her ne kadar dilim kullansak da aralık gerçeklemelerini sundum, yine de hata verdi. Acaba sorun nerede?
erdem (Moderatör) #2
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
dmd 2.059 ve Türkçe karakter kullanmadan denedim sorunsuz çalışıyor.

0 numarali ogrencinin islemi basladi
0 numarali ogrencinin islemi bitti
85
1 numarali ogrencinin islemi basladi
1 numarali ogrencinin islemi bitti
86
2 numarali ogrencinin islemi basladi
2 numarali ogrencinin islemi bitti
87
3 numarali ogrencinin islemi basladi
3 numarali ogrencinin islemi bitti
88
4 numarali ogrencinin islemi basladi
4 numarali ogrencinin islemi bitti
89
5 numarali ogrencinin islemi basladi
5 numarali ogrencinin islemi bitti
90
6 numarali ogrencinin islemi basladi
6 numarali ogrencinin islemi bitti
91
7 numarali ogrencinin islemi basladi
7 numarali ogrencinin islemi bitti
92
8 numarali ogrencinin islemi basladi
8 numarali ogrencinin islemi bitti
93
9 numarali ogrencinin islemi basladi
9 numarali ogrencinin islemi bitti
94
Kadir Can #3
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben de dmd 2.059 ile deniyorum.
Türkçe karakterleri çıkararak da denemiştim, yine de hata vermişti. Türkçe karakterleri çıkararak bir daha denedim, hala hata veriyor.
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben 32 bit XP'de denedim. Acaba derleyicinde bir problem olabilir mi. Diğer örnekleri derliyor mu.

Eğer 32 bit Ubuntu kullanıyorsan:

$ sudo dpkg --purge dmd

ile tüm dmd paketlerini kaldırmayı dene.

$ sudo find / | grep dmd

Hatta yukarıdaki gibi kaldırdıktan sonra dmd'ye ait olabileceğini düşündüğün dizin ve dosyalar varsa bunları elle silmeni tavsiye ederim. Sonra bu işlemlerden sonra hala duruyorsa /etc/dmd.conf dosyasını silip tekrar dmd'yi kurmayı dene. Bu mesajda benzer bir konu konuşulmuştu.
erdem (Moderatör) #5
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
Kadir Can:
    auto sonuçlar = taskPool.map!(ö => ö.ortalamaNot)(öğrenciler);
Hiç derleyiciyi kuracağım diye zahmet etme burada map yerine taskPool.map yazmışsın  ;-)
Kadir Can #6
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
64 bit Windows 7'de ve 32 bit PCBSD'de denedim. İkisinde de aynı hatayı veriyor.
Dediğin gibi belki yeniden dmd kurulumu ile düzelebilir. Hemen deniyorum.

Sen koşut olmayan programı denemişsin. Onun bir iki satır altında aynı programın koşut olarak gerçeklenmiş hali var. Bir de onu deneyebilir misin?
Bu mesaj Kadir Can tarafından değiştirildi; zaman: 2012-07-11, 05:44.
erdem (Moderatör) #7
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet haklısın. İyi yakalamışsın sanırım bir hata var.

Ben bu konuyu henüz okumadım ayrıntılarını bilmiyorum ama Ali bey de D haber grubunda bir mesaj göndermiş. Ama oradaki hata sanırım standart çıkışın kullanılmasıyla ilgili.
Bu mesaj erdem tarafından değiştirildi; zaman: 2012-07-11, 06:12.
acehreli (Moderatör) #8
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ı
Yanıtlanan mesaj #6
Teşekkürler Kadir Can,

Nedeninden tam emin değilim ama internette kapamalarla (closure) ilgili olduğu konusunda yazılar bulunuyor. En azından şu çözüm işe yarıyor:

// Modül düzeyinde tanımlanmış olmalı:
double öğrenciNotOrtalaması(Öğrenci öğrenci)
{
    return öğrenci.ortalamaNot();
}
 
// ...
 
    auto sonuçlar = taskPool.map!öğrenciNotOrtalaması(öğrenciler);

Ali
Kadir Can #9
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Rica ederim.
Kapama kavramıyla ilgili aklıma bir şey takıldı. Sözlüğümüzden kontrol ettim, işlemleri ve işledikleri kapsamı bir arada saklayan program yapısı olarak tanımlanmış. Yani yanlış anlamadıysam temsilciler kapamalara örnek oluyor; peki {} olarak tanımladığımız kapsamlar kapamaya örnek oluyor mu?
Ayrıca burada hataya sebep olan şey doğru anladıysam lambda fonksiyon, değil mi?
acehreli (Moderatör) #10
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ı
Yanıtlanan mesaj #1
Tam olarak anlamadığım başka bir çözüm daha buldum: Eğer yazıda gösterildiği gibi 3 parametresiyle denersek de çalışıyor:

    auto sonuçlar = taskPool.map!(ö => ö.ortalamaNot)(öğrenciler);    // derleme HATASI
    auto sonuçlar = taskPool.map!(ö => ö.ortalamaNot)(öğrenciler, 3); // derleniyor 

Ali
erdem (Moderatör) #11
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
    auto sonuçlar = taskPool.map!(ö => ö.ortalamaNot)(öğrenciler, 3); // derleniyor 

Maalesef ben de siz bu mesajı yazmadan önce denemiştim derlenmiyor.
Bu mesaj erdem tarafından değiştirildi; zaman: 2012-07-11, 06:38.
acehreli (Moderatör) #12
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ı
Yanıtlanan mesaj #9
Kadir Can:
Kapama kavramıyla ilgili aklıma bir şey takıldı. Sözlüğümüzden kontrol ettim, işlemleri ve işledikleri kapsamı bir arada saklayan program yapısı olarak tanımlanmış. Yani yanlış anlamadıysam temsilciler kapamalara örnek oluyor

Fonksiyonel dil geçmişim olmadığı için bu kavramları anlamam zaman almıştı. Yukarıdaki tanım aslında "temsilci"nin tanımı. Kapama olması için sanırım ek olarak bir işlevden dışarıya dönüş değeri olarak döndürülmesi gerekiyor:

import std.stdio;
 
auto kapamaDöndür(int i)
{
    int j = i * 2;
    alias int delegate(int) KapamanınTürü;
    KapamanınTürü kapama = x => x + j;    // yerel kapsamı kullanıyor
    return kapama;
}
 
void main()
{
    auto kapama = kapamaDöndür(42);
    writeln(kapama(1));
}

En azından TDPL'de verilen örneği öyle anlıyorum. Ayrıca 'alias'a neden gerek olduğundan hiç emin değilim.

; peki {} olarak tanımladığımız kapsamlar kapamaya örnek oluyor mu?

Yalnızca {} salt kapsam belirliyor. Temsilci bile olabilmesi için öncelikle lambda olmalı tabii.

Ayrıca burada hataya sebep olan şey doğru anladıysam lambda fonksiyon, değil mi?

Hatanın söylediğine bakılırsa lambda yerelmiş, ama yerel lambdalar taskPool.map gibi global olmayan şablonlara gönderilemiyorlarmış. (?)

Ali
acehreli (Moderatör) #13
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ı
Yanıtlanan mesaj #11
erdem:
Maalesef ben de siz bu mesajı yazmadan önce denemiştim derlenmiyor.

Haklısın. :(

Ali
Kadir Can #14
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Teşekkürler, şimdi daha iyi anladım. :)
acehreli (Moderatör) #15
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ı
Yanıtlanan mesaj #1
Kadir Can on 2012-07-11, 04:37:
Error: template instance amap!(__lambda5) cannot use local '__lambda5(__T4)' as parameter to non-global template amap(functions...)

Bu teknik bir yetersizlikmiş. Böyle bir durumu gerçekleştirebilmek için dmd'nin hem nesne göstergesini hem de kapsam göstergesini barındırması gerekirmiş ama ne yazık ki tek göstergeye yer varmış.

Bu durumla ilgili bir kaç hata raporu:


  http://d.puremagic.com/issues/show_bug.cgi?id=3051

  http://d.puremagic.com/issues/show_bug.cgi?id=3052

Özellikle bu bizimle ilgili çünkü David Simcha bu sıkıntıyı std.parallelism modülü yazarken yaşamış:

  http://d.puremagic.com/issues/show_bug.cgi?id=5710

Benim tahminime göre, örnek kodlar önceki dmd sürümlerinin hataları nedeniyle deneniyordu ve belki de hatalı oluyordu ama basit örnekler hatayı göstermeye yetmiyordu. Bu hatalar 2.059'da giderilmiş ve bizim örnekler de kabak gibi ortada kalmış olabilir! :-p

Ali
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-18, 04:11:41 (UTC -08:00)