我有一个这样的传统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还不熟悉。我可以像SWIG/python array inside structure中那样使用包装的数组模板one_name,但我不确定如何将其扩展到字符串数组。我只需要从python中读取这些字符串(如上所述),而不需要编写它们。我可以用访问器来完成,这样python看起来像:
print s.get_name(i) # prints the ith name

但我更喜欢数组接口,因为它类似于C。

最佳答案

如果只需要从python中读取它们,那么一个快速的解决方案是创建一个使用std::strings的适配器类和一个适配器函数。所有这些都通过%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());
}
%}

关于python - 如何在SWIG中公开C字符串char [M] [N]的数组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21636001/

10-11 22:48
查看更多