- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是 swig 的新手,当我访问一个带有双指针作为参数的函数时遇到了一个奇怪的 TypeError。
这是我的文件:
例子.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
例子.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) {}
例子.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?
我的错误在哪里?
最佳答案
我认为你的问题其实在于:
void test_cd(char * c0, double * d0);
并且您的参数应该是 double
,而不是 double*
。
引用您的评论
您的代码是:
E.test_cc("Hello","World");
E.test_cd("Hello",42);
你的原型(prototype)是:
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;
如果可以的话,我会避免第三个。
再次编辑...
http://www.dalkescientific.com/writings/NBN/c_extensions.html
显示了如何从 python 调用 C 代码(包括传递 double 值)的工作示例。在 python 和 C 代码中搜索 iterate_point 以查看其工作原理。你不应该有一个 double 指针,它应该只是一个普通的 double ,如前所述。
关于c++ - 类型错误 : unable to acces a wrapped function with double pointer argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230627/
我是一名优秀的程序员,十分优秀!