【问题标题】:Store Variables/Arrays/Objects in C++ object for Python将变量/数组/对象存储在 Python 的 C++ 对象中
【发布时间】: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() 函数接收参数的副本,对其进行修改,然后将其丢弃。

标签: python c++ ctypes


【解决方案1】:

来自the ctypes documentation:

默认情况下,假定函数返回 C int 类型。其他返回类型可以通过设置函数对象的restype属性来指定。

您的问题暗示您在 64 位 Windows 上,而在 64 位 Windows 上,指针为 8 个字节,ints 只有 4 个字节,因此指针的前 4 个字节正在丢失。

【讨论】:

  • 非常感谢,但主要问题是关于在 C++ 类中存储局部变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多