Forum: Ders Arası RSS
std.math.sqrt hatası
erdem (Moderatör) #1
Üye Tem 2009 tarihinden beri · 978 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: std.math.sqrt hatası
Bu kadar basit bir kod neden hata veriyor olabilir sizce  :huh:

import std.stdio, std.math;
 
struct MatematikYardımcı
{
    /* ... */    
    
    /*
    verilen iki nokta arasındaki uzaklığı döndürür
    */
 
    float uzaklık(int x1, int y1, int x2, int y2)
    {
        return sqrt(pow(y2 - y1, 2) + pow(x2 - x1, 2));
    }
}
 
void main ()
{
    MatematikYardımcı matematik;
    auto uzaklık = matematik.uzaklık(5, 10, 25, 35);
}
Hata mesajı da bu şekilde:

test.d(13): Error: function std.math.sqrt called with argument types
        ((int))
matches both:
        std.math.sqrt(float x)
and:
        std.math.sqrt(real x)
Kadir Can #2
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bu aslında işlev yükleme ile alakalı sanırım. Yani std.math modülünde sqrt() işlevi yüklenerek kullanılmış, birinci kullanım parametre olarak float alıyor, ikincisi ise real alıyor. Sorun da bu noktada ortaya çıkıyor: Yüklenmiş işlevlerde hangi tanımın kullanılacağı derleyici tarafından derleme zamanında seçiliyor; ama bu noktada int parametre için hem float hem de real'e uygun olduğu için derleyici hangi tanıma uyacağına karar veremiyor ve hata veriyor. Burada da aynı duruma bir örnek var.
Çözmek için doğrudan float veya real parametre geçirebiliriz; veya bu iki türden birisine daha uygun bir tür seçebiliriz.
Bu mesaj Kadir Can tarafından değiştirildi; zaman: 2012-07-14, 12:58.
Avatar
Salih Dinçer #3
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şu şekilde çalışıyor ve tür dönüşümü gerekiyormuş:
assert(std.math.sqrt(cast(float)9) == 3);
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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ı
Yanıtlanan mesaj #1
erdem:
        return sqrt(pow(y2 - y1, 2) + pow(x2 - x1, 2));

Teşekkürler bu satırı aşağıdaki gibi değiştirince sorun çözüldü.
        return sqrt(cast(float)((pow(y2 - y1, 2) + pow(x2 - x1, 2))));
acehreli (Moderatör) #5
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ı
Başka bir çözüm:

        immutable float araToplam = pow(y2 - y1, 2) + pow(x2 - x1, 2);
        return sqrt(araToplam);

(immutable tabii ki gerekli değil.)

Ayrıca hiç önemli değil ama tür dönüşümlerinde ben cast'i en sona saklama taraftarıyım. O sanki bana diğer yöntemler işe yaramayınca başvurulan bir araç gibi geliyor. (Belki de gereksizce böyle düşünüyorum.)

Eğer tür dönüşümü gerekiyorsa ben ilke olarak öncelikle to'yu düşünüyorum:

import std.conv;
// ...
        return sqrt(to!float(pow(y2 - y1, 2) + pow(x2 - x1, 2)));

Ama dediğim gibi: Bu durumda cast'ten bir farkı yok.

Ali
erdem (Moderatör) #6
Ü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ız bu daha temiz bir kod olduğu için kodu gösterdiğiniz şekilde değiştirdim.
Avatar
huseyin #7
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Erdem bu soruyu yazmasaydı ben yazacaktım dün gece projeyi derlemeye çalışmıştım aynı hatayı almıştım
Huseyin
Avatar
Salih Dinçer #8
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Neyse ki C#'a göre çok şanslısınız! Çünkü CLR'dan olsa gerek; zırt pırt her yerde (hatta köşeli parantez içinde bile) tür dönüşümü ister. Ben C#'dan o yüzden soğudum. Mutlaka bir çok nesnenin to veya from ile başlayan bir dönüştürücüsü vardır. Hal böyleyken sizi VS'ye bağlı bırakır. Öyle ya hangi birini ezberleyeceksin...:)

D'nin arkasında yine MS gibi büyük bir firma olabilseydi sanırım C#'dan bile başarılı olabilirdi. Yapılan bir çok şey gönüllülük esasıyla gerçekleştiğine göre şu an deneyebildiğimiz kodlar ve sevinerek çalıştırdığımız programlar büyük bir başarıdır. Sizlerin desteğiyle eminim daha iyi yerlere gelecektir. Bakınız Japonlar, niye biz Türkler olmasın... (okulların açılmasıyla İstanbul etkinliği istiyorum!)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
huseyin #9
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hocam onu bunu bırakın da ben .Net düşmanı bir insanım c# ın kütüphanelerinden nefret ediyorum
Huseyin
Avatar
Salih Dinçer #10
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
:)

Gerçi düşman olmaya gerek yok çünkü hepimiz tek bir dünyaya "Hello World" yazmaktayız. Ama kütüphaneleri bir karşılaştırırsak şurada (dlang.org sitesindeki soldaki başlıklarda) yer alan Phobos kütüphanesi gittikçe kabarmakta...

Hala orada denemediğim o kadar çok kod var ki herhalde ömrüm yetmez ki o zamana kadar bir bu kadar da kod üretilir...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Avatar
huseyin #11
Üye Haz 2012 tarihinden beri · 363 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
.Net benden uzak dursun yeter ya neymiş IL koduna çeviriyomuş ya adamlar onu direkt c# koduna decompile ediyor :)
Huseyin
erdem (Moderatör) #12
Ü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 #7
huseyin325325:
Erdem bu soruyu yazmasaydı ben yazacaktım dün gece projeyi derlemeye çalışmıştım aynı hatayı almıştım

Sanırım std.math.sqrt kütüphanesinde değişiklikler olmuş. Windows üzerinde projeyi derlemek için make -f win32.mak demen yeterli..

Ya da burada dersler var. Ama ilgimi kaybettiğim için devamı gelmeyecek. Aslında bu da bana biraz ders oldu. Bir projeyi kodlamayı bitirmeden aynı anda bir taraftan belge, ders, döküman hazırlamaya çalıştım. Ama ikisi beraber aynı anda olmuyor.

O yüzden bundan sonra eğer bir projede yer alırsam ilk önce kodlama kısmını bitireceğim. Ondan sonra belge ya da ders kısmı zaten yavaş yavaş bir şekilde oluyor.

Aslında burada Derelict3'de var:

https://github.com/aldacron/Derelict3

Hatta SDL2 desteği de var. Bu gün denedim ama SDL2 ile ilgili yeterli kaynak bulamadım şimdilik. Ayrıca burada sadece C ilintileri var.

Ama benim yazdığımda sadece SDL ilintileri yok. SDL ilintilerinin yanı sıra neredeyse 2D bir oyun kütüphanesine benzemeye başlamıştı. Eğer geliştirmek, devam ettirmek isteyen arkadaşlar varsa devam ettirebilirler.
Avatar
Salih Dinçer #13
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bir de std.mathspecial varmış! Gerek algorithm sınıfı olsun gerekese matematik ile ilgili diğer sınıflar, gerçekten de çok bilimsel şeyler ile dolu...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
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, 00:36:00 (UTC -08:00)