将 C++ 中的"extern C"与 ctypes 的向量一起使用
Using "extern C" from C++ with vector for ctypes
我的目标是使用ctypes从Python中调用我单独创建的C++库,在那里我通过指针将numpy向量传递给C++例程。因此,Python将分配内存并只传递地址,然后C++例程将访问数据并执行计算并返回结果。
由于我是ctypes的新手,现在我正在逐步构建一个可行的玩具示例。我开始编写C++代码,并创建一个Python包装器代码将使用的C外部接口。我甚至还没有开始使用Python包装器代码,但在这方面已经有了一些经验。
这是我的例子,其中包括一个构造函数和一个简单的total函数。
// 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
类(当我编写实际算法时,我会发现它很有用)的情况下,我如何编写外部C部分?我遇到麻烦是因为vector
是STL的一部分,它不能很好地与外部C一起工作吗?
提前谢谢。
首先,让我们回答您的问题。您应该更改构造函数,使其采用与Data_new相同的参数,并将输入转换为std::vector。然而,看起来有几个概念问题需要首先关注:
-
数组和向量是不等价的:如果您的输入指向数组,但如果要使用向量,则需要复制将数组中的所有元素放入向量中(或询问向量构造函数为您完成)。你需要复印因为所有STL容器都保存着放进去。
-
您可以使用两个迭代器来构造向量,其中包括:
myContents(data, data + numberOfElements);
但这就引出了第二个概念点——在代码的签名中没有任何东西可以告诉输入数组有多大
-
在"数据"中,您持有指向向量的指针,但您永远不要释放它。这是内存泄漏。话虽如此,你应该可能只是抓住一个向量,而不是指向向量的指针。
- 将 boost::odeint 与向量类一起使用,而无需调整向量的大小
- 将 [][] 运算符与向量一起使用?
- 如何在 c++ 中将变换与对的向量一起使用
- 与unordered_map向量一起使用的最小示例中的scoped_allocator_adaptor错误
- 如何将基于范围的 for 循环与未来的<T>向量一起使用
- 如何将"查找"和"substr"函数与向量一起使用?
- 如何将find_first_not_of与字符串向量一起使用
- 将Mutex和lock_guard与C++中的向量一起使用
- 将赋值运算符与 unique_ptr 向量一起使用
- 将 at() 与自定义对象的向量一起使用时的分割错误
- 自定义分配器有时会与stl向量一起崩溃
- 将 C++ 中的"extern C"与 ctypes 的向量一起使用
- 将memcpy与Eigen类型的向量一起使用安全吗
- 将赋值运算符与类实例和向量一起使用
- 将二叉搜索与向量一起使用
- 在C++中将一个向量与另一个向量一起排序
- 将自定义类与向量一起使用:'std::vector'默认构造函数错误
- 与向量一起使用的C++可为Null/可选项的整数
- 与指针向量一起使用的最佳智能指针是什么
- 如何将提取运算符 (>>) 与向量一起使用<bool>?