TypeError:无法访问带有双指针参数的包装函数

1 投票
1 回答
702 浏览
提问于 2025-04-17 06:51

我刚接触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 个回答

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,正如之前所说的。

撰写回答