我有一些C代码,我想暴露给Python。它有一个调用约定是这样的:%typemap和%exception for C语言错误代码为SWIG,Python
int add(int a, int b, int *err)
在返回值是(A + B)或什么,但如果出事了,那么我会得到* ERR错误代码。我想从Python的角度来包装这个函数,使其表现如下:
def add(a,b):
if something_bad:
raise RuntimeError("something bad")
return a+b
这应该很简单吧?但我没有找到它。
这里的东西,我有工作,但看的出来了myerr3
杂牌:
%module myswig
%feature("autodoc","1");
%{
int add(int a, int b, int *err){
if(a < 0)*err = 1;
if(b < 0)*err = 2;
return a+b;
}
char *err_string(int err){
switch(err){
case 1:return "first argument was less than 0";
case 2:return "second argument was less than 0";
default:return "unknown error";
}
}
%}
%typemap(in,numinputs=0) int *err (int myerr = 0){
$1 = &myerr;
};
%exception{
$action
if(myerr3 != 0){
PyErr_SetString(PyExc_RuntimeError,err_string(myerr3));
return NULL;
}
};
int add(int a, int b, int *err);
此行为,因为它应该,例如用
import myswig
print "add(1,1) = "
print myswig.add(1,1)
# prints '2'
print "add(1,-1) = "
print myswig.add(1,-1)
# raises an exception
# we never get here...
print "here we are"
,但我真的不能使用这个解决方案,因为如果我有另一个功能,如
int add(int a, int b, int c, int *err)
然后我的myerr3
kludge将分解。
解决这个问题的最好方法是什么,而不改变C代码的调用约定?
为什么错误添加负数? – 2012-02-26 20:34:27
我怀疑这是一个简单的例子,它实际上是一个更复杂的函数,显示了它的方式 – Flexo 2012-02-26 20:40:42
是正确的。完整的应用程序是http://ascend4.org/FPROPS,这是一个流体属性库。 – jdpipe 2012-02-26 21:02:54