python /痛饮 : Output an array

标签 python return-value swig

我正在尝试从使用 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); 
 } 
} 

我的代码编译得很好,但是当我运行访问这个函数时它挂起(没有更多的调试方法)。

对我哪里出错有什么建议吗?

谢谢。

最佳答案

允许长度变化的最简单方法是添加另一个输出参数来告诉您数组的大小:

%module test

%include <stdint.i>

%typemap(in,numinputs=0,noblock=1) size_t *len  {
  size_t templen;
  $1 = &templen;
}

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

%inline %{
float *oldmain(size_t *len) {
  static float output[] = {0.f, 1.f, 2, 3, 4};
  *len = sizeof output/sizeof *output;
  return output;
}
%}

这是从 this answer 修改而来的添加 size_t *len 可用于在运行时返回数组的长度。 typemap 完全隐藏了 Python 包装器的输出,而是在 %typemap(out) 中使用它而不是固定大小来控制返回列表的长度。

关于 python /痛饮 : Output an array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11679023/

相关文章:

python - 使用 SimpleKML 绘制大圆

python - 使用正则表达式 python 删除德语中的女性结尾

python - 如何在 while 循环内返回一个值

python - 使用 np.where 查找二维数组中的匹配行

python - 计算文档中的 token

C++ 返回但未存储的值会发生什么?

r - 使用base r函数如何检查向量中是否存在元素

java - 管理供 Java GUI 使用的 C++ API 的 Java 包装 : proper version control

python - 如何通过 SWIG 在 Python 和 C 之间编码指向 cstring 的指针

python - 使用 SWIG 打印为 Python 包装的 C++ 类时不调用 __str__()