如何为指向指针的引用定义SWIG类型映射?

2 投票
2 回答
2982 浏览
提问于 2025-04-15 14:42

我有一个用C++写的Publisher类,里面有两个方法:

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

我正在使用SWIG为这个类生成Python绑定。在我的swig .i文件中,我写了以下内容:

 %pointer_class(double*, ptrDouble);

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

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

不过,尝试使用GetFieldReference方法时出现了类型错误(TypeError):

GetFieldReference("value", newValue)

我觉得我需要为double*&创建一个类型映射(typemap),这样才能返回一个ptrDouble,但我不太确定这个类型映射应该是什么样子的。

2 个回答

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 赋值过去。

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)

撰写回答