Python / SWIG:输出数组

发布于 2021-01-29 17:12:06

我试图从使用SWIG for Python包装的C函数输出值数组。我正在尝试使用以下类型映射。

伪代码:

int oldmain() {
float *output = {0,1};
return output;
}

类型图:

%typemap(out) float* { 
   int i; 
  $result = PyList_New($1_dim0); 
   for (i = 0; i < $1_dim0; i++) { 
 PyObject *o = PyFloat_FromDouble((double) $1[i]); 
 PyList_SetItem($result,i,o); 
 } 
}

我的代码可以很好地编译,但是当我运行该函数时,它挂起了(没有更多调试方法)。

关于我要去哪里的任何建议?

谢谢。

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这应该可以帮助您:

    /* example.c */
    
    float * oldmain() {
        static float output[] = {0.,1.};
        return output;
    }
    

    您将在此处返回一个指针,而swig不知道它的大小。普通的$ 1_dim0不起作用,因此您必须进行硬编码或做其他魔术。像这样:

    /* example.i */
    %module example
    %{
     /* Put header files here or function declarations like below */
      extern float * oldmain();
    %}
    
    %typemap(out) float* oldmain {
      int i;
      //$1, $1_dim0, $1_dim1
      $result = PyList_New(2);
      for (i = 0; i < 2; i++) {
        PyObject *o = PyFloat_FromDouble((double) $1[i]);
        PyList_SetItem($result,i,o);
      }
    }
    
    %include "example.c"
    

    然后在python中,您应该获得:

    >> import example
    >> example.oldmain()
    [0.0, 1.0]
    

    添加类型映射时,您可能会发现-debug-tmsearch非常方便,即

    swig -python -debug-tmsearch example.i
    

    在为寻找合适的“输出”型式时,应明确指出您的型式已被使用float *oldmain。另外,如果您只想访问c全局变量数组,则可以使用typemapvarout代替来完成相同的技巧out



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看