0

我创建了一个简单的 SWIG 辅助函数来处理从我包装的 C++ 代码返回的指针:

//in module foo:
%inline %{
  double getPtrVal(double *ptr, int i) {
    return (double) ptr[i];
  }
%}

这工作得很好,直到我尝试了类似的东西:

for i in range(n):
  for j in range(n):
    val = foo.getPtrVal(ptrs, i)

此时 Python 返回了一个 TypeError,抱怨这n不是整数:

  for i in range(n):
TypeError: an integer is required

我向你保证n,事实上,它是一个整数(type(n)始终返回<type 'int'>)。因此,我认为问题出在 SWIG 函数中。奇怪的是,foo.getPtrVal(ptrs, i)调用n次数没有问题,然后,在第一次退出内部循环后立即j抛出错误。有任何想法吗?如果可以澄清部分,我可以发布更多代码段。谢谢!

4

2 回答 2

0

实际代码是否缺少冒号?

于 2013-07-18T17:01:23.597 回答
0

我以前遇到过类似的问题。如果 SWIG C 包装器代码的某些部分没有正确清理 Python 的内部异常状态,那么下一个能够在 Python 代码中引发异常的内置调用将似乎是异常的来源。

range可以引发异常,因此 Python 在调用它后会检查其内部异常状态,查看 SWIG C 包装器代码遗留的异常,并假设它一定来自range.

当我无法解决这样的问题时,我使用了这个丑陋的解决方法来清除内部异常状态:

try:
        sys.stdout.write("") # any call capable of raising an exception will do
except:
        pass

正确的方法可能是使用%exception指令;请参阅SWIG 手册。但是您首先需要弄清楚是哪个调用导致了异常。

于 2013-07-18T20:41:44.547 回答