【发布时间】:2021-07-11 21:02:02
【问题描述】:
是否可以将变量/数组/对象存储在 C++ 对象中以通过 Python 存储和修改此类数据?例如,我想将点/多边形/体素/等的数组/向量存储在 Python 中的 C++ 对象中。有时,我想对它们做点什么(更改/添加/删除)。
这是我的简单代码,但我有一个异常:
C++:
class Foo{
public:
std::vector<openvdb::Vec3s> vertices_test;
void generateArray(std::vector<openvdb::Vec3s> ar){
// JUST DO SOMETHING GENERIC
for (int i = 0; i < 100; i++) {
ar.push_back(openvdb::Vec3s(0.3, 0.1, 0.2));
}
}
};
extern "C" {
__declspec(dllexport) Foo* Foo_new(){ return new Foo(); }
__declspec(dllexport) void Foo_generateArray(Foo* foo){ foo->generateArray(foo->vertices_test); }
}
Python部分:
class Foo(object):
def __init__(self):
self.obj = lib.Foo_new()
def generateArray(self):
lib.Foo_generateArray(self.obj)
f = Foo()
f.generateArray()
但是当我运行 Python 时出现异常:
OSError: exception: access violation reading 0x0000000058ED7D28
如您所见,我尝试将 std::vectoropenvdb::Vec3s vertices_test 对象存储为 C++ 对象中的局部变量。不过好像出了点问题。
另外,是否可以在 generateArray() 函数中返回 float/int 而不是 void? 谢谢你。
【问题讨论】:
-
请不要将 C++ 描述为“C/C++”。这是一个荒谬的术语。 C 有“对象”,但它们是与 C++“面向对象”对象完全不同的概念。这使用 C 接口只是 Python 绑定方式的产物,这是完全正常的,不会生成此 C/C++ 代码。
-
“访问冲突”通常意味着“访问了一个无效的指针”。
-
请注意,您的
generateArray()函数接收参数的副本,对其进行修改,然后将其丢弃。