在SWIG中为包含联合的结构(Python)创建类型映射

2024-09-26 22:44:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始使用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;

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

^{pr2}$

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

大多数Python类型映射和typei都有SWIG文档。我很有信心我理解它们是如何编写的以及它们是如何工作的,但是这个结构应该如何被类型映射的复杂性让我很困惑。在

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

有人能给我举个例子吗?我似乎找不到任何地方需要的榜样。在

我将非常感谢你的帮助。在

--编辑--

我在Python中的预期用途如下:

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

其中some\u expr值是元组或dict或其他东西。这可能不太可能,但我愿意就如何使它成为某种格式的输出提供建议,然后可以在Python中使用该格式从中提取定义的union值。在

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


Tags: the函数an类型格式typesome结构
1条回答
网友
1楼 · 发布于 2024-09-26 22:44:39

使用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文档),但这种方法应该相当简单。在

相关问题 更多 >

    热门问题