繁体   English   中英

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

[英]Accessing a int16 array using numpy.i and swig

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

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

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

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

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

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

这是我到目前为止的内容:

%init %{
    import_array();
%}

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

编译时,我得到:

Error: Syntax error in input(1).

关于如何进行这项工作的任何想法?

在这种情况下,numpy.i无法正常工作。 主要问题是numpy.i不支持(输出)类型映射,在这种情况下正是我需要的。

编译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($1[i]);
    PyList_SetItem($result,i,o);
  }
}
%apply int16*{lag[2]};

大部分是从这个答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM