使用 numpy.i 和 swig 访问 int16 数组

Accessing a int16 array using numpy.i and swig

c 结构中的以下内容已用 swig 包装,以便我可以访问从另一个 swig 包装程序获取的数据,在 python.

struct RadarParm {
  struct {
    char major;
    char minor;
  } revision;

  struct {
   char code;
   char *time;
   char *command;
  } origin;

  int16 cp;
  int16 stid;
  int16 *pulse;
  int16 *lag[2]; 
  char *combf;
};

我的主要问题是 int16 *lag[2]。尝试读取我的 python 代码中的数据时:

p_data['lag'] = prm.lag

其中 prm 是通过方法 struct RadarParm* getRadarParm() 从 rtserver.c 文件返回的 RadarParm 类型,p_data 是一个 python 字典,它存储 RadarParm 的每个部分.

这是访问 prm.lag 时我的当前输出:

<Swig Object of type 'int16 **' at 0x1fd55d0>

我发现似乎有一个处理数组和 int16 数据类型的 numpy.i 文件。根据我有限的理解,我认为这将允许我访问这些数据。如果我能正确实现它。

这是我目前的情况:

%init %{
    import_array();
%}

%apply (int16** ARGOUTVIEW_ARRAY1, DIM_TYPE* DIM1) {(int16* lag,2)};

编译时我得到:

Error: Syntax error in input(1).

关于如何使这项工作有任何想法吗?

在这种情况下 numpy.i 不起作用。主要问题是 numpy.i 不支持 (out) 类型映射,这正是我所需要的。

编译 swig rtserver.i 文件时改为使用命令 -debug-tmsearch。使用命令的输出,我能够确定 RadarParm::lag 定义的 swig 类型以及它应该是什么。这是有效的代码。

%typemap(out) int16*[2] {
  int i;
  $result = PyList_New(2);
  for (i = 0; i < 2; i++) {
    PyObject *o = PyInt_FromLong([i]);
    PyList_SetItem($result,i,o);
  }
}
%apply int16*{lag[2]};

大部分摘自 this answer