使用 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
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