TypeError:无法使用双指针参数访问包装函数

时间:2011-11-22 16:57:48

标签: c++ python swig

当我访问一个带有双指针作为参数的函数时,我对swig非常新,并且得到了一个奇怪的TypeError。

以下是我的文件:

Example.hpp

#ifndef _EXAMPLE_HPP
#define _EXAMPLE_HPP

class Example {
public:
    void test_cc(char * c0, char * c1);
    void test_cd(char * c0, double d0);
    void test_cdp(char * c0, double * d0);
};

#endif // _EXAMPLE_HPP

Example.cpp

#include "Example.hpp"

void Example::test_cc(char * c0, char * c1) {}
void Example::test_cd(char * c0, double d0) {}
void Example::test_cdp(char * c0, double * d0) {}

Example.i

%module Example
%{
#include "Example.hpp"
%}

#include "Example.hpp"

最后我的testfile test_Example.py:

#!/usr/bin/env python

import Example

E = Example.Example()

E.test_cc("Hello","World");
E.test_cd("Hello",42);
E.test_cdp("Hello",42);

当我运行./test_Example.py时,我收到错误消息

Traceback (most recent call last):
  File "./test_Example.py", line 9, in <module>
    E.test_cdp("Hello",42);
  File "Example.py", line 77, in test_cdp
    def test_cdp(self, *args): return _Example.Example_test_cdp(self, *args)
TypeError: in method 'Example_test_cdp', argument 3 of type 'double *'

访问函数test_cc有效,test_cd也...为什么不test_cdp?

我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

我认为你的问题实际上在:

void test_cd(char * c0, double * d0);

并且您的参数应该是double,而不是double*

参考您的评论

您的代码是:

E.test_cc("Hello","World");
E.test_cd("Hello",42);

你的原型是:

void test_cc(char * c0, char * c1);
void test_cd(char * c0, double d0);

“Hello”和“World”是字符串文字,它们会衰减为const char *类型。所以,他们是指针。当你在test_cc中传递c0和c1时很好,因为它需要一个指针。

虽然c0是test_cd中的指针,但d0不是 - d0是double类型,而不是指针到double。因此,您必须将指针传递给double。

您可以通过在堆栈上创建double并传入其地址来执行此操作:

double hi_mom = 83.2;
test_cd("some string" &hi_mom);

或通过声明指针并使其指向堆栈变量,将其传递到:

double hi_mom = 83.2;
double* ptr = &hi_mom;
test_cd("some string", ptr);

或通过声明指向动态内存的指针并将其传递到:

double* ptr = new double(83.2);
test_cd("some string", ptr);
delete ptr;

如果可以,我会避开第3个。

再次修改...

http://www.dalkescientific.com/writings/NBN/c_extensions.html

显示了如何从python调用C代码的工作示例,包括传递double。在python和C代码中搜索iterate_point以查看它是如何工作的。你不应该有一个double的指针,它应该是正常的双倍,如前所述。