我想在 Python 中使用一个 C 函数:
extern int convertAtoB( stateStruct *myStruct,
const double PointA[3],
double PointB[3]);
使用 SWIG,我想我需要定义一个类型映射来转换两个点(PointA 为输入,PointB 为输出),以便 Python 可以使用它。 typemaps.i 中似乎没有适用于此的类型映射,因此我必须定义一个。我似乎无法在 SWIG 文档中找到数组的示例。
我想像这样使用这个库:
s = externalStruct()
point_a = [1, 2, 3]
result, point_b = convertAtoB(s, point_a)
print point_b
"expect [4, 5, 6]"
我该怎么做?谢谢
你快到了。要摆脱 python 签名中的虚拟参数,您需要更改%typemap(in)
for PointB[3]
to %typemap(in,numinputs=0)
指示 SWIG 忽略该输入值(无论如何您已经获取了它的副本)。这将从 python 方法签名中删除虚拟参数。
但是我不确定您是否需要复制整个%typemap(in)
对于该专业。可能有一种方法可以重用实际的类型映射,但我不知道如何。否则你最终会得到一个额外的
%typemap(in,numinputs=0) double PointB[3] (double temp[$1_dim0]) {
int i;
if (!PySequence_Check($input)) {
PyErr_SetString(PyExc_ValueError,"Expected a sequence");
return NULL;
}
if (PySequence_Length($input) != $1_dim0) {
PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected $1_dim0 elements");
return NULL;
}
for (i = 0; i < $1_dim0; i++) {
PyObject *o = PySequence_GetItem($input,i);
if (PyNumber_Check(o)) {
temp[i] = (double) PyFloat_AsDouble(o);
} else {
PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers");
return NULL;
}
}
$1 = temp;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)