2012-08-28 52 views
0

我的目标是使用ctypes从Python中调用一个C++库,我分别创建了一个C++库,我通过指针将numpy向量传递给C++例程。因此,Python将分配内存并传递地址,然后C++例程将访问数据并执行计算并返回结果。使用C++的“extern C”和ctypes向量

因为我是ctypes的新手,现在我正在逐步构建一个工作玩具的例子。我将开始编写C++代码并创建Python封装代码将使用的C extern接口。我甚至还没有开始Python包装代码,但已经有了一些这方面的经验。

这是我的例子,它包含一个构造函数和一个简单的总函数。

// foo.cpp // 
#include <iostream> 
#include <string> 
#include <vector> 
using namespace std; 

class Data { 
public: 
    Data(vector<double>*); 
    void PrintTotal(void); 
private: 
    vector<double>* myContents; 
}; 
Data::Data(vector<double>* input) { 
    std::cout << "Entered constructor in C++" << std::endl; 
    myContents = input; 
} 
void Data::PrintTotal(void) { 
    double total = 0; 
    for (int i=0; i<myContents->size(); i++){ 
    total += (*myContents)[i]; 
    } 
    std::cout << "Hello, my total is " << total << std::endl; 
} 

extern "C" { 
    Data* Data_new(double (**input)) {return new Data(input);} 
    void Print_Total(Data* pData) {pData->PrintTotal();} 
} 

请特别注意,我正在使用STL的矢量类,这可能是下面描述的问题的一部分。这个想法是类Data持有一个指向数据的指针,并不复制数据。

当我尝试编译是使用我们的Linux机器上的命令

g++ -c -fPIC foo.cpp -o foo.o 

,我得到以下错误:

foo.cpp: In function âData* Data_new(double**)â: 
foo.cpp:26: error: no matching function for call to âData::Data(double**&)â 
foo.cpp:13: note: candidates are: Data::Data(std::vector<double, std::allocator<double> >*) 
foo.cpp:6: note:     Data::Data(const Data&) 

这似乎非常清楚对我说:它说的方式我在foo.cpp的倒数第三行(#26)中调用Data构造函数并不符合我在代码的C++部分编写的构造函数。在C++代码和C extern代码中,我试图说输入是一个指向双精度向量/数组的指针。我尝试了#36行的其他选项,但它仍然不能编译。

如何在C++部分仍然使用vector类(我将在编写真正的算法时会发现它很有用)时编写extern C部分?我遇到麻烦了,因为vector是STL的一部分,它不适用于extern C?

在此先感谢。

+0

如果您希望'Date_new'和'Print_total'函数在C程序中可用,那么这将不起作用。即使使用extern“C”,C程序也不能使用类似“Data”的类。 –

回答

0

首先,让我们回答你的问题。你应该改变你的构造函数,以便它接受与Data_new相同的参数,并将输入转换为std :: vector。然而,它看起来像有几个概念问题,你需要把重点放在第一:

  • 数组和向量不等价的:如果你的输入点到 数组,但你想用工作矢量,您需要将 中的所有元素复制到矢量中(或者请求一个 矢量构造函数为您执行此操作)。您需要执行复制 ,因为所有STL容器都保存了放入其中的元素的副本。

  • 可以使用两个迭代器,以构建其载体:

    myContents(data, data + numberOfElements);

    但是,这带来了第二个概念点---有没有在你的代码,告诉你如何大签名输入数组是。

  • 在数据中你持有一个指向矢量的指针,但是你永远不会释放它。这是内存泄漏。话虽如此,你应该 可能只是坚持一个向量,而不是一个向量的指针。