On Saturday, 2 November 2019 at 18:31:28 UTC, Stefan Koch wrote:
On Saturday, 2 November 2019 at 17:49:09 UTC, Luh wrote:
Hello,

When trying to pass a D function to the C callback, the compiler says:

'Error: cannot implicitly convert expression &this.onProcessCb of type extern (C) bool delegate(const(short*) a, ulong b, void* c) to extern (C) bool function(const(short*), ulong, void*'

because my function is member of a class (compiles when the function is out of the class).

Is there any way to say to solve this ?
The wiki isn't very clear about the C callbacks:
https://dlang.org/spec/interfaceToC.html#callbacks

C code:
----
typedef bool (*onProcessCallback)(const short*, size_t, void*);
----


D Code:
-----
class Game
{
        onProcessCallback m_onProcessCb;
        
        this()
        {
                m_onProcessCb = &onProcessCb; // Error here
        }
        
        void onProcess()
        {
                // ...
        }

        extern(C) bool onProcessCb(const short* a, size_t b, void* c)
        {
                onProcess();
                return true;
        }
}

private extern(C)
{
        // Should call onProcess() when executed by the C lib
alias onProcessCallback = bool function(const short*, size_t, void*);
}
-----

you are missing a static in your member function's signature.
The callback is not providing a this pointer.

My problem is, that the onProcess function should not be static because it uses a variable inside the class.

like:
-----
class Game
{
        private short[] m_a;
        
        void onProcess(short[] a)
        {
                m_a ~= a;
                // ...
        }

        extern(C) bool onProcessCb(const short* a, size_t b, void* c)
        {
                onProcess();
                return true;
        }
}
-----

So I think I just can't. :(

Reply via email to