Pass BM function pointers to C/C++ code

BlitzMax Forums/BlitzMax Programming/Pass BM function pointers to C/C++ code

Hi Mark,

Is it possible to pass BM function pointers into C or C++ code? I want to write a LUA module for BM but I need to be able to call back into BM.

Tommy.

Hats off to Mark. Here is the answer. I'll tell everyone something right now... BM is awesome and an extermely powerful GameDev solution. Okay here it is:

C Code
------

int (*callback)(const char *);

void RegisterCallback ( int (*infunc)(const char *) )
{
callback = infunc;
}

void CallMe ()
{
callback("Hello from C");
}

BM Code
-------

Strict

Import "test.c"

Extern
Function RegisterCallback ( functionptr@Ptr )
Function CallMe ()
End Extern

Function Test:Int( char:Byte Ptr )
' OMG I just got a call back
DebugStop
End Function

RegisterCallback( Test )
CallMe()


----- END ------

So what is this good for? Well I'll be writing a small LUA module for BM. You'll be able to export your internal BM functions to LUA and have those callable from script. Makes scripting of bots, AI, missions, save games etc extermely easily. Well done Mark!

Hi,

That will work because BMX does auto function ptr->byte ptr casting, but a 'safer' way would be...

Extern
Function RegisterCallback( func( char:byte ptr ) )
End Extern

...which would prevent you from accidentally passing the wrong 'type' of function to RegisterCallback.

One more thing mark, is it possible to get a pointer to something from a c function? For instance I want to gt a lua_state * from one of the lua functions... is this possible?

Hi,

I tend to just wrap these up in a 'byte ptr', eg:

Extern
Function GetLuaState:Byte Ptr()
End Extern

Local lua_state:Byte Ptr=GetLuaState()

Easy thanks.