我有以下C功能,我尝试SWIG-ify:
void GetAttOrder(int node, DCE_ORDER order, float att[3]);
我想在Python中调用并通过以下方式访问:
node = 0; order = DCD_TYPR;
attitude = GetAttOrder(node, order);
attitude[0] // 45.232
我之前已将DCE_ORDER类型实施为
typedef enum
{
DCD_TPYR = 0,
DCD_TYPR,
DCD_TYRP,
...
DCD_PRYT
} DCE_ORDER;
我在SWIG documentation找到了类似问题的一些文档,但我没有运气实施解决方案。我还调查了其他一些stackoverflow问题(this one似乎很可疑),也无济于事。我怀疑我应该在这里使用一个类型图,但是当谈到SWIG时我很年轻而且很愚蠢。
有任何建议或指示吗?
非常感谢。
答案 0 :(得分:1)
几天后结束了解决这个问题。如果你有一个想要离开的向量,你可以做类似的事情:
%typemap(in, numinputs=0) float vec3out[3] (float temp[3]) {
$1 = temp;
}
%typemap(argout) float vec3out[3] {
int i;
$result = PyList_New(3);
for (i = 0; i < 3; i++) {
PyObject *o = PyFloat_FromDouble((double) $1[i]);
PyList_SetItem($result,i,o);
}
}
然后可以按照我的要求通过Python访问此功能。此外,如果您要将另一个函数传递给(getter / setter函数对),则可以使用以下代码:
%typemap(in) float vec3in[3] (float temp[3]) {
int i;
if (!PySequence_Check($input)) {
PyErr_SetString(PyExc_ValueError,"Expected a sequence");
return NULL;
}
if (PySequence_Length($input) != 3) {
PyErr_SetString(PyExc_ValueError,"Size mismatch. Expected 3 elements");
return NULL;
}
for (i = 0; i < 3; i++) {
PyObject *o = PySequence_GetItem($input,i);
if (PyNumber_Check(o)) {
temp[i] = (float) PyFloat_AsDouble(o);
} else {
PyErr_SetString(PyExc_ValueError,"Sequence elements must be numbers");
return NULL;
}
}
$1 = temp;
}
允许你传入一个列表。