2016-04-10 24 views
0

Geri aramalar alarak bir C işlevi sarmak amacıyla üye işlevleri olarak delege olarak görülen sorunla karşılaştım. C fonksiyonu delegeleri kabul etmedi, bu yüzden yerine başka bir şey üzerinde yerleşmiş: Gördüğünüz gibi, ben üye olacak bir temsilci (çağırarak değişmez geri arama ayarı fonksiyonu için bir işlev geçiyorumBu işlev neden delege olarak görünüyor?

extern(C) void onMouse(void delegate(int, int, int) nothrow callback) 
{ 
    glfwSetMouseButtonCallback(handle, 
     function void (GLFWwindow* h, int button, int action, int mods) nothrow 
     { 
      callback(button, action, mods); 
     } 
    ); 
} 

işlev buraya geçiyorum).

hata olarak
Error: function pointer glfwSetMouseButtonCallback (GLFWwindow*, extern (C) void function(GLFWwindow*, int, int, int) nothrow) is not callable using argument types (GLFWwindow*, void delegate(GLFWwindow* h, int button, int action, int mods) nothrow @system) 

, tip void delegate olarak olarak ikinci parametre gösterilmektedir:

Ancak, ben beklendiği gibi sonuna kadar değildir.

So. Sorum şu: neden bu oluyor? Açıkça görebildiğiniz gibi, kodda function void diyor.

Not: Bunu gördüm: Pass delegates to external C functions in D. Çözüm görünüşe göre bir kesmek. Ama internette bir çözüm bulamazsam deneyeceğim.

+0

Ana probleminiz, "C" ve "C++" işlevleri için * bağlantı * gibi görünüyor. Benim için ne * istediğini çok açık değil * Olması gereken - C veya C++ bağlantısı olması gereken "delege" dir? – tofro

+0

@tofro Korkarım ki anlamıyorum. Temsilci edebi, yalnızca 'bu' ekli bir işlev değişkeni olup, onu C ile uyumsuz kılar ve (bir sebepten dolayı) kolaylıkla bir işlev değişkeni haline dönüştürülemez. –

+0

Derleyici iletilerini yakından izleyin. 'GlfwSetMouseButtonCallback() 'ın ikinci argüman olarak bir' extern 'C'' fonksiyon göstergesini alacağını söylediniz. Ancak bunun yerine bir C++ işlev işaretçisi ("temsilci") teslim ediyorsunuz. Bu iki tip uyumlu değildir. – tofro

cevap

1

Bunu işlev olarak bildirseniz bile, olamaz. onMouse'a ilettiğiniz parametreye güvenir. Bu parametre yerel bir değişkendir ve bir işlev gövdesinde onlara erişme onları bir temsilci yapar. Tek yapmanız gereken parametreyi function olarak değiştirip &callback ile iletmektir (o zaman GLFWwindow parametresini parametre olarak eklemeniz gerekir). Alternatif olarak, bu geri bildirimin daha sonra ana döngünüzde işleyebileceğiniz olayları yerleştirdiği genel bir liste oluşturabilirsiniz.

+0

Gerçekten D'nin işlev değişmezini dolaylı olarak bir delege editörüne dönüştürmemesi gerektiğini düşünüyorum.Bu bana oldukça fazla karışıklık verdi. –

İlgili konular