我一直在使用Elmer在DLL中构建一些python代码(有关elmer的详细信息,请参阅http://elmer.sourceforge.net/。)
我试图找出是否有办法构建.elm文件,以便我可以在elmer中使用指针参数或设置回调函数。
在.elm文件中,而是检索如下值:
double get(int id)
我可能想做类似的事情:
void get(int id, double* val)
或设置回调
void registerCallback(int id, void (*MyCb)(double value) )
只是为了澄清一下,这是在.elm文件中告诉elmer如何在dll的c代码中包装python函数,而不是在c或python源代码中。
答案 0 :(得分:1)
在搜索了elmer源代码后,我想出了如何进行回调。它没有任何方法可以传递指针(除了用于字符串类型的char *)。
在.elm文件中,首先需要定义回调函数原型,以回调关键字开头。然后使用该回调的名称作为.elm
中函数原型的参数#snipped from mytest.elm
#define callbacks types
callback int MyCb(int arg1, int arg2)
#function prototypes
int register_callback(string someOtherArgs, callback MyCb)
python代码将像任何其他参数一样接收回调函数,它可以自由地调用它,就好像它是具有声明参数的本机python函数一样。如果你想连续调用回调(就像大多数事件处理程序一样),你必须在你的python代码中创建自己的循环机制。一种选择是循环,直到回调返回零;例如:
#snipped from mytest.py
def register_callback(someOtherArg, callbackFunc):
cbArg1, cbArg2 = (1,2) #just some dummy values
while(callbackFunc(cbArg1, cbArg2) == TRUE):
print("I'm calling the callback...")
time.sleep(.1)
要使用此功能,您需要使用c / c ++代码:
//snipped from mytest.c
//define the callback function.
//based on example python code, this would be called continuously until it
//returns 0
int MyAwesomeCallbackFunction(int arg1, int arg2) {/*definition goes here*/ return 1};
//register the callback and start the python based loop that calls MyAwesomeCallbackFunction
register_ui_callback("LadaDeDa", &myAwesomeCallbackFunction);