我有一个像这样的传统C / C ++结构(还有许多其他成员):
struct S {
char one_name[MAX_LEN];
char names[N_NAMES][MAX_LEN];
}
和创建这些的C函数:
S *get_S(...)
我想通过swig导出S和名称,所以我可以在python中执行此操作:
s = MyModule.get_S()
print s.one_name # I have this working
print s.names[1] # should print the 2nd string, this is harder
我认为我需要某种类型的地图,但我是新手。我可以在SWIG/python array inside structure中使用wrapped_array模板执行one_name
,但我不确定如何将其扩展为字符串数组。我只需要从python中读取这些字符串(如上所述),而不是编写它们。我可以使用访问器来实现它,所以python看起来像:
print s.get_name(i) # prints the ith name
但我更喜欢数组接口,因为它类似于C语言。
答案 0 :(得分:1)
如果您只需要从python中读取它们,那么快速解决方案是创建一个使用std::string
的适配器类和一个适配器函数。这一切都通过%inline进入.i文件,你还需要%rename和%ignore。例如,
%ignore(S)
%rename(S) Swrap
%rename(get_S) get_SWrap
%newobject get_Swrap
%inline %{
struct Swrap
{
inline Swrap(S* s): one_name(s.one_name)
{
for (i=0; i<N_NAMES; ++i)
names[i] = s.names[i];
// no longer need s:
delete s;
}
string one_name;
string names[N_NAMES];
};
Swrap* get_Swrap() {
return new Swrap(get_S());
}
%}