我刚开始使用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函数的所有指针参数都是输出,其中*类型告诉用户要查看哪个指针值。在
使用SWIG,你可以完全改变界面。例如,您可以在存储指针的.i文件中创建一个新类,并返回该类的实例:
您可能需要告诉SWIG谁拥有ExprWrapper的expr字段(您或Python可以看到SWIG文档),但这种方法应该相当简单。在
相关问题 更多 >
编程相关推荐