TypeError:无法访问带有双指针参数的包装函数
我刚接触swig,遇到了一个奇怪的类型错误,当我用一个双指针作为参数去调用一个函数时。
这是我的文件:
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"
最后是我的测试文件 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 个回答
我觉得你的问题其实出在这里:
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 时是没问题的,因为它期待的是一个指针。
但是在 test_cd 中,c0 是一个指针,而 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;
不过如果可以的话,我建议你避免使用第三种方法。
再编辑一下...
http://www.dalkescientific.com/writings/NBN/c_extensions.html
这个链接展示了如何从 Python 调用 C 代码的一个工作示例,包括如何传递一个 double。你可以在 Python 和 C 代码中搜索 iterate_point 来看看它是怎么工作的。你不应该为 double 使用指针,它应该只是一个普通的 double,正如之前所说的。