gpt4 book ai didi

python - 如何在 SWIG 中公开 C 字符串数组 char[M][N]?

转载 作者:行者123 更新时间:2023-11-28 18:45:02 26 4
gpt4 key购买 nike

我有一个像这样的遗留 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 中那样使用 wrapped_array 模板执行 one_name ,但我不确定如何将其扩展到字符串数组。我只需要从 python 中读取这些字符串(如上),而不是编写它们。我可以用访问器来做,所以 python 看起来像:

print s.get_name(i) # prints the ith name

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

最佳答案

如果您只需要从 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());
}
%}

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com