Gerçekten çok pis bir hataymış, çok şey denedim, çözümü okumadım ve tabii ki beceremedim...:)
Şimdi bu iletiyi onayladıktan sonra iletinin geri kalanını okumalıyım... :rolleyes:
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
July 19, 2012 Eş zamanlı programlama ile ilgili zorlu bir hata | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Gerçekten çok pis bir hataymış, çok şey denedim, çözümü okumadım ve tabii ki beceremedim...:) Şimdi bu iletiyi onayladıktan sonra iletinin geri kalanını okumalıyım... :rolleyes: -- |
July 19, 2012 Eş zamanlı programlama ile ilgili zorlu bir hata | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | @Salih;
Üstteki kullanımda dizi değişmezdir, ekleme bile yapamayız.
Yukarıdaki kullanımda ise dizinin sadece var olan elemanları değişmez oluyor, ekleme yapabiliyoruz. -- |
July 19, 2012 Eş zamanlı programlama ile ilgili zorlu bir hata | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Keyifle okudum, hele şu satırları...:) Alıntı (acehreli): >Hani atanamazdı! Ah Ali! :) Yukarıdaki bir atama değil, kopyalayarak kurma. b, a'dan kopyalanıyor. Atama olabilmesi için b'nin önceden var olması gerekir... Evet, atanamıyor: 'deneme.d(86030): Error: variable deneme.main.b cannot modify struct with immutable members' Yani immutable üyeler değiştirilemezlermiş. Biliyoruuum... :) Kusura bakmayın uzun oldu ama ben bu konudan çok ders aldım. :) Özetle çözüme ulaştığına sevindim. Gerçi çözümü çok anlamasam da...:) Alıntı (acehreli): >Bu arada, derleyicinin üye için 'immutable int[]' türünü kabul etmemisinin geçerli nedeni var. Görebiliyor musunuz? Benim onu görmem de biraz zaman aldı. -- |
July 19, 2012 Eş zamanlı programlama ile ilgili zorlu bir hata | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Ben de sorunun yanıtını kendi başıma bulamadım. Ama adımları denedim. Gerçekten hatayı iyi yakalamışsınız. Kadir Can'ın mesajını okuduktan sonra ona katılıyorum :) İnce bir ayrıntı.. -- |
July 19, 2012 Eş zamanlı programlama ile ilgili zorlu bir hata | ||||
---|---|---|---|---|
| ||||
Posted in reply to Kadir Can | Alıntı (Kadir Can): >
|
July 19, 2012 Eş zamanlı programlama ile ilgili zorlu bir hata | ||||
---|---|---|---|---|
| ||||
Posted in reply to Ali Çehreli (acehreli) | Alıntı (acehreli): >Yani türler aynı:
immutable float[] param = [ 0.9, 3.33, 7.2, 10.1 ] // Toplam 4 parametre
immutable float[] param = [ 0.9, 3.33, 7.2, 10.1 ] // Toplam 4 parametre
|
July 19, 2012 Eş zamanlı programlama ile ilgili zorlu bir hata | ||||
---|---|---|---|---|
| ||||
DilimKombinasyonu konusuna devam ederken pis bir hatayla boğuşmak zorunda kaldım. :) Hatayı bulmam ve çözmem çok zamanımı aldı. :( Aşağıdaki basitleştirilmiş program bu hatayı içeriyor. Program çok basit: main() bir işçi başlatıyor; ona bir Görev gönderiyor ve karşılığında da geriye bir int alıyor. Ne yazık ki aşağıdaki program takılıp kalıyor (umarım platform farkları beni yalıltmıyordur :)):
Eğer yapacak hiiiç başka işiniz yoksa bu noktada üzerinde çalışmak isteyebilirsiniz. Tabii program çok küçük olduğu için rastgele yerlerini değiştirmek bile ne ile ilgili olduğunu hemen göstermeye yetecektir. Ben çok daha uzun ve karmaşık bir programla boğuşmak zorundaydım. :) Beni hatanın kaynağına götüren adımlar şunlardı (yararsız adımların çoğuna gerek görmüyorum ;)):
spawnLinked(), işçi sonlandığında sahip tarafta LinkTerminated hatası atılmasına neden olur. Güzel: '$ ./deneme Dikkat ederseniz "İşçi görevi aldı" yine de yok.
(Notz: Meğerse hata bir AssertError imiş ve AssertError Exception'dan türemediği için catch(Exception) onu yakalayamamış (AssertError Error'dan türer.) Sonunda Exception ve Error'ın üst türleri olan Throwable türünü catch edince yakalayabildim. Ama bunu aşağıdaki adımlardan sonra farkettim.)
Ne yazık ki aynı hata! :(
Evet, öyle: './deneme Sonunda hatanın bir AssertError olduğunu ve variant.d'nin 286 numaralı satırında atıldığını görüyoruz. Tam yolu verilen kaynak kodu açıyorum:
Yani tür atanamaz bir türmüş. Nasıl? Hata mesajı o türün Görev olduğunu da söylüyor. Deneyelim:
Hani atanamazdı! Ah Ali! :) Yukarıdaki bir atama değil, kopyalayarak kurma. b, a'dan kopyalanıyor. Atama olabilmesi için b'nin önceden var olması gerekir. Deneyelim:
Evet, atanamıyor: 'deneme.d(86030): Error: variable deneme.main.b cannot modify struct with immutable members' Yani immutable üyeler değiştirilemezlermiş. Biliyoruuum... :) Üyeyi öyle seçerek hem kendimi sağlama almışım hem de bir mesaj olarak başka bir iş parçacığına gönderebilmişim. Çünkü asıl programa dönüp iki yerdeki immutable'ı kaldırınca şöyle oluyor:
Derleme hatası: '/usr/include/d/dmd/phobos/std/concurrency.d(319): Error: static assert "Aliases to mutable thread-local data not allowed." Bunun önüne kilitlerle filan geçilebilir ama onlara girmek istemiyorum. Ben veriyi immutable olarak işaretlemek ve iş parçacıkları arasında serbestçe paylaşmak istiyorum. Değişmez olduğu için hiçbir tehlikesi olamaz. Sonunda çözümü farkediyorum: Görevin üyesi değil, onun eriştirdiği veri immutable olmalı. Zaten bana yeterli olan da o:
Sonunda istenen sonuç: './deneme Kusura bakmayın uzun oldu ama ben bu konudan çok ders aldım. :) Bu arada, derleyicinin üye için 'immutable int[]' türünü kabul etmemisinin geçerli nedeni var. Görebiliyor musunuz? Benim onu görmem de biraz zaman aldı. Ali -- |
July 19, 2012 Eş zamanlı programlama ile ilgili zorlu bir hata | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Alıntı (Salih Dinçer): >Boyutu da değiştirilemeyen ise immutable(immutable'(int)'[])'' ile dört bir yandan kuşatılıyor...:) O zaman buna şaşırabilirsin ama o türler aslında aynı çünkü D'de tür belirteçleri derinlemesinedir. Dilim immutable (veya const) olunca elemanlar da immutable (veya const) oluyor. Yani türler aynı:
Bu arada, tamam, bu işin düzeneğini anlıyoruz ama b a'dan atanabilse ne zararı olurdu? Ona uygun bir örnek düşünebiliyor musunuz? Yani dilin kuralları neden böyle? Zor bir soru değil tabii ama izin verilseydi zararı olabilecek bir örnek görsek? :) Ali -- |
July 19, 2012 Eş zamanlı programlama ile ilgili zorlu bir hata | ||||
---|---|---|---|---|
| ||||
Posted in reply to Salih Dinçer | Aslında bu örneğin konuştuklarımızdan pek bir farkı yok. r0, r1, ve r2 referansları S.dilim'in immutable olmasına güveniyorlar. Eğer b'ye atamaya izin verilseydi durum onların sandıklarından farklı olurdu:
Ali -- |