2012-08-28 77 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);

    但是,這帶來了第二個概念點---有沒有在你的代碼,告訴你如何大簽名輸入數組是。

  • 在數據中你持有一個指向矢量的指針,但是你永遠不會釋放它。這是內存泄漏。話雖如此,你應該 可能只是堅持一個向量,而不是一個向量的指針。