无论如何在Elmer中使用指针和回调

时间:2014-07-29 17:36:49

标签: python

我一直在使用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源代码中。

1 个答案:

答案 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);