使用C ++中的“extern C”和ctypes的向量

时间:2012-08-28 23:47:56

标签: c++ stl ctypes extern

我的目标是使用ctypes从Python中调用我正在单独创建的C ++库,我通过指针将numpy向量传递给C ++例程。所以Python会分配内存并只传递地址,然后C ++例程将访问数据并执行计算并返回结果。

由于我是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拥有一个指向数据的指针,并且不会复制数据。

当我尝试使用命令

编译它时
g++ -c -fPIC foo.cpp -o foo.o
在我们的Linux机器上,我收到以下错误:

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外部代码中,我试图说输入是指向双精度矢量/数组的指针。我在第36行尝试了其他选项,但仍然无法编译。

如何在C ++部分中使用vector类(我将在编写真实算法时发现有用)时如何编写extern C部分?我遇到了麻烦,因为vector是STL的一部分,它与extern C不兼容吗?

提前致谢。

1 个答案:

答案 0 :(得分:0)

首先,让我们回答你的问题。您应该更改构造函数,使其获取与Data_new相同的参数,并将输入转换为std :: vector。但是,看起来您需要首先关注几个概念问题:

  • 数组和向量不等价:如果你的输入指向一个 数组,但你想使用矢量,你需要复制 从数组到向量的所有元素(或问一个 矢量构造函数为你做)。你需要复制 因为所有STL容器都保留了元素的副本 把它们放进去。

  • 您可以使用两个迭代器构造向量,其中包含:

    myContents(data, data + numberOfElements);

    但是这提出了第二个概念点 - 代码的签名中没有任何内容告诉你输入数组有多大。

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