c++ - SWIG C++ Python : wrapping int by reference or pointer

标签 c++ python reference integer swig

我正在尝试将一些 C++ 函数包装到 Python 包装器中。 为此,SWIG 似乎是一种不错且简单的方法。

换行有效,但我在通过引用或指针传递整数时遇到问题。 由于 Python 无法使用引用,SWIG 在内部将它们转换为指针。

一些简单的示例代码:

布拉特.hpp :

#ifndef __BLAAT_HPP__
#define __BLAAT_HPP
class Blaat
{
public:
 int mA;
 float mB;

public:
 Blaat() {}
 void getA(int & fA);
 void setA(const int fA);
 ~Blaat() {}
};

#endif // __BLAAT_HPP__

Blaat.cpp

#include "Blaat.hpp"
#include <iostream>

void Blaat::getA(int & fA) {
 std::cout << "[Blaat::getA] fA = " << fA << std::endl;
 fA = mA;
} 

void Blaat::setA(const int fA) {
 std::cout << "[Blaat::setA] fA = " << fA << std::endl;
 mA = fA;
}

Blaat.i:

%module Blaat
%{
/* Includes the header in the wrapper code */
#include "Blaat.hpp"
%}

/* Parse the header file to generate wrappers */
%include "Blaat.hpp"

然后将代码转换为 Python 包装器:

#!/bin/sh
swig -python -c++ -v $1.i 
gcc -c $1_wrap.cxx -fPIC -I/usr/include/python2.6
gcc -shared $1_wrap.o -o _$1<library_path> so -L. -l$1

一切正常。现在,我启动 Python 并执行以下操作:

from Blaat import *
a = Blaat()
b = int(1)
a.setA(b) <-- fine, calls setA() function fine
a.getA(b) <-- does not work

在调用“getA()”时,出现以下错误:

Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "Blaat.py", line 86, in getA
   def getA(self, *args): return _Blaat.Blaat_getA(self, *args)
TypeError: in method 'Blaat_getA', argument 2 of type 'int &'

请注意,我在通过引用和指针传递参数时都遇到了这个问题。 查看生成的“Blaat_wrap.cxx”文件,停在实际的类型转换处:

res2 = SWIG_ConvertPtr(obj1, &argp2, SWIGTYPE_p_int,  0 );
if (!SWIG_IsOK(res2)) {
 SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "Blaat_getA" "', argument " "2"" of type '" "int &""'"); 
}

这意味着函数 SWIG_ConvertPtr() 失败了,这很奇怪,因为它检查的类型似乎是 SWIGTYPE_p_int。 从“setA()”函数中,我们看到类型转换有效(如果按值传递)。

The SWIG documentation tells me ):

C++ references are supported, but SWIG transforms them back into pointers. For example, a declaration like this :

class Foo { public: double bar(double &a); }

has a low-level accessor

double Foo_bar(Foo *obj, double *a) { obj->bar(*a); }

有人可以把我丢失的东西放进去吗?我在这一点上很困...... Found this post, but this did not help either

最佳答案

我不认为 python 有通过引用返回的概念,但这是我的解决方案:

Blaat.i:

%module Blaat
%include typemaps.i
%apply int &OUTPUT { int & fA };
%{
/* Includes the header in the wrapper code */
#include "Blaat.hpp"
%}

/* Parse the header file to generate wrappers */
class Blaat
{
public:
 Blaat();
 void getA(int & fA);
 void setA(const int fA);
 ~Blaat();
};

b.py:

from Blaat import *
a = Blaat()
b = int(1)
a.setA(b)
b = a.getA()

运行:

python b.py
[Blaat::setA] fA = 1
[Blaat::getA] fA = 63

关于c++ - SWIG C++ Python : wrapping int by reference or pointer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6709608/

相关文章:

python - Django 开发服务器未检测到我的 html 文件中的更改

xpath - 如何通过被引用的属性查找元素?

c++ - 如何存储非常大的斐波那契数的输出?

c++ - 迭代时删除列表中的最后一个元素会导致错误

c++ - 试图在类中使用 boost::spirit::qi 解析器的段错误

python - 如何在图例中添加多边形

python - 无法在 MacOS : 'zsh: command not found: nvm' 上使用 nvm install

C# 后期绑定(bind)到 com/activeX 服务器,一种方法有问题

dll - 在非开发机器上加载错误的程序集?

c++ - Qt 应用程序在使用文件打开对话框后将焦点切换到不同的应用程序