gpt4 book ai didi

python - 使用 SWIG 从 C 返回列表到 Python

转载 作者:太空宇宙 更新时间:2023-11-04 03:47:11 25 4
gpt4 key购买 nike

我有以下 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 时我又年轻又愚蠢。

有什么建议或指示吗?

非常感谢。

最佳答案

几天后最终解决了这个问题。如果你有一个你想出去的载体,你可以做这样的事情:

%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;
}

这将允许您传入一个列表。

关于python - 使用 SWIG 从 C 返回列表到 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23353445/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com