Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SWIG从C返回到Python_Python_C_Swig - Fatal编程技术网

使用SWIG从C返回到Python

使用SWIG从C返回到Python,python,c,swig,Python,C,Swig,我正在尝试使用以下C函数: 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_订单类型实现为 typedef enum { DCD_TPYR = 0, DCD_TYPR,

我正在尝试使用以下C函数:

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_订单类型实现为

typedef enum
{
  DCD_TPYR = 0,
  DCD_TYPR,
  DCD_TYRP,
  ...
  DCD_PRYT
} DCE_ORDER;
我在中找到了一些关于类似问题的文档,但我没有实现任何解决方案。我还研究了其他一些stackoverflow问题(似乎很接近),但也没有结果。我怀疑我应该在这里使用类型图,但说到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);
  }
}
%typemap(in,numinputs=0)float vec3out[3](float temp[3]){
$1=临时工;
}
%类型映射(argout)浮点vec3out[3]{
int i;
$result=PyList_New(3);
对于(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;
}
%typemap(in)float vec3in[3](float temp[3]){
int i;
如果(!PySequence_Check($input)){
PyErr_SetString(PyExc_ValueError,预期为序列);
返回NULL;
}
如果(PySequence_长度($input)!=3){
PyErr_SetString(PyExc_ValueError,“大小不匹配。应为3个元素”);
返回NULL;
}
对于(i=0;i<3;i++){
PyObject*o=PySequence\u GetItem($input,i);
如果(PyNumber_检查(o)){
温度[i]=(浮点)PyFloat\u为双精度(o);
}否则{
PyErr_SetString(PyExc_ValueError,“序列元素必须是数字”);
返回NULL;
}
}
$1=临时工;
}

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

您是否尝试过创建一个重载
float*GetAttOrder(int节点,DCE\u顺序)
来调用您的
GetAttOrder
?我相信SWIG知道如何将指针返回当作Python列表来对待。不,我没有尝试过,但我最终还是找到了一些可行的方法。我自己回答。