gpt4 book ai didi

python - 在 SWIG 中为包含 union 的结构创建类型映射 (Python)

转载 作者:行者123 更新时间:2023-11-30 17:30:03 24 4
gpt4 key购买 nike

我刚开始使用 SWIG,并且正在为以下结构制作 Python 类型映射而苦苦挣扎:

typedef struct si2drExprT
{
si2drExprTypeT type;
union
{
si2drInt32T i;
si2drFloat64T d;
si2drStringT s; /* most likely an identifier */
si2drBooleanT b;
} u;

si2drValueTypeT valuetype; /* if the type is a fixed value */

struct si2drExprT *left; /* the exprs form a classic binary tree rep of an arithmetic expression */
struct si2drExprT *right;
} si2drExprT;

它当前正在一个函数调用中使用:

si2drVoidT    si2drIterNextComplexValue ( si2drValuesIdT iter,
si2drValueTypeT *type,
si2drInt32T *intgr,
si2drFloat64T *float64,
si2drStringT *string,
si2drBooleanT *boolval,
si2drExprT **expr,
si2drErrorT *err )

我需要si2drExprT **expr是输出而不是指针。我已经使用 %apply int *OUTPUT { si2drErrorT* err }; 成功地进行了其他几个指针输出格式。

我已阅读大部分有关类型映射和 Python 类型映射的 SWIG 文档。我非常有信心理解它们的编写方式和工作方式的概念,但是如何对这个结构进行类型映射的复杂性让我感到困惑。

我无法切换到 ctypes,因为最终我需要对 Perl 做同样的事情,而 SWIG 似乎是转换为多种语言的最佳选择(据我所知)。我也无法控制 C 函数的定义方式。我的包装器转换必须独立于 C 库。

有人能给我举个例子吗?我似乎无法在任何地方找到我需要的示例级别。

我非常感谢您提供的任何帮助。

-- 编辑--

我在 Python 中的预期用途是这样的:

(some_int, some_flt, some_str, some_bool, some_expr, error) = si2drIterNextComplexValue(some_iter)

其中 some_expr 值是元组或字典或其他东西。这可能不太可能,但我愿意接受有关如何使其成为某种格式的输出的建议,然后我可以在 Python 中使用它来从中提取定义的 union 值。

C 函数的所有指针参数都旨在作为输出,其中 *type 告诉用户要查看哪个指针值。

最佳答案

使用 SWIG,您可以完全更改界面。例如,您可以在 .i 文件中创建一个存储指针的新类,并返回该类的实例:

// .i file: 

... what you have already to export si2dr* types ...

struct ExprWrapper {
si2drValueTypeT type;
si2drInt32T intgr;
si2drFloat64T float64,
si2drStringT string;
si2drBooleanT boolval;
si2drExprT *expr;
si2drErrorT err;
};

%inline %{
ExprWrapper si2drIterNextComplexInt(si2drValuesIdT iter) {
ExprWrapper wrapper;
si2drIterNextComplexInt(iter, & wrapper.type, ..., & wrapper.expr, & wrapper.err);
return wrapper;
)
%}

您可能必须告诉 SWIG 谁拥有 ExprWrapper 的 expr 字段(您或 Python - 请参阅 SWIG 文档),但这种方法应该相当简单。

关于python - 在 SWIG 中为包含 union 的结构创建类型映射 (Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25319529/

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