2

我有一个用 C++ 编写的 Publisher 类,有以下两种方法:

PublishField(char* name, double* address);
GetFieldReference(char* name, double*& address);

此类的 Python 绑定是使用 SWIG 生成的。在我的 swig .i 文件中,我有以下内容:

 %pointer_class(double*, ptrDouble);

这让我可以发布一个在 Python 变量中定义的字段:

value = ptrDouble()
value.assign(10.0)
PublishField("value", value.cast())

但是,尝试使用 GetFieldReference 方法会导致 TypeError:

GetFieldReference("value", newValue)

我想我需要为返回 ptrDouble 的 double*& 创建一个类型映射,但我不太确定它会是什么样子。

4

2 回答 2

1

这是我想出的一个可行的解决方案。

在 swig.i 文件中添加一个包装函数:

%inline %{
    double * GetReference(char* name, Publisher* publisher)
    {
         double* ptr = new double;
         publisher->GetFieldReference(name, ptr);
         return ptr;
    }
%}

现在从 Python 我可以使用以下内容:

value = ptrDouble.frompointer(GetFieldReference("value", publisher)
于 2009-10-02T15:55:05.033 回答
0

这个类型图应该可以解决问题 -

// Typemaps for double *&
%typemap(in) double *& (double *ppDouble  = NULL) %{
$1 = &ppDouble  ;
%}

%typemap(argout) double *& {
*(double **)&jarg2 = *$1;
}

%typemap(javain) double *& "$javainput"

您可能需要检查分配具有所需双精度值的 jarg2(在“argout”类型映射中)是否正确,或者应该分配 jarg1。

于 2010-04-01T15:38:14.363 回答