当我访问一个带有双指针作为参数的函数时,我对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?
我的错误在哪里?
答案 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的指针,它应该是正常的双倍,如前所述。