On 2011-11-29 12:53, Dainius (GreatEmerald) wrote:
I seem to have another problem with the function pointer approach. I
am trying to set up a function that would pass the function pointers
from C to D, and DMD refuses to compile it:

If I have the function pointer struct with D calling convention
pointers, like this:

     struct S_FrontendFunctions {
         void function(int) SoundPlay;
         void function() RedrawScreen;
     }
     S_FrontendFunctions FrontendFunctions;

And I try to set it in D like this:

     FrontendFunctions.SoundPlay = function(int){};
     FrontendFunctions.RedrawScreen = function(){};

And have a function for transferring the pointer from C like this:

     extern (C):
     void SetRedrawScreen(void function() RedrawScreen)
     {
         FrontendFunctions.RedrawScreen = RedrawScreen;
     }

DMD throws an error in the last function:

     Error: cannot implicitly convert expression (RedrawScreen) of type
extern (C) void function() to void function()

Now if I define the two function pointers as extern(C) like this:

     struct S_FrontendFunctions {
         extern (C) void function(int) SoundPlay;
         extern (C)  void function() RedrawScreen;
     }

DMD still complains, but this time about when I set the pointers from
D directly:

     Error: cannot implicitly convert expression (__funcliteral3) of
type void function() pure nothrow @safe to extern (C) void function()

Any ideas about how to make it work from both D and C sides?

In stead of doing this:

FrontendFunctions.SoundPlay = function(int){};
FrontendFunctions.RedrawScreen = function(){};

Do something like this:

extern (C)
{
    void playSound (int) {};
    void redrawScreen () {};
}

FrontendFunctions.SoundPlay = &playSound;
FrontendFunctions.RedrawScreen = &RedrawScreen;

--
/Jacob Carlborg

Reply via email to