繁体   English   中英

ctypes的指针列表。Python和C++ function中的结构

[英]List of pointers of ctypes.Structures in Python and C++ function

我检查了无数帖子,但找不到解决方案。 我在 Python 和 c++ 中有相同的类。

C++

__host__ __device__ class Vector3f {
    public:
        float x;
        float y;
        float z;
};

__host__ __device__ class Point3f {
    public:
        float x;
        float y;
        float z;
};

struct Values {
    Point3f position;
    Vector3f velocity;
};

struct Orb {
    std::string name;
    float mass;
    float radius;
    float density;
    Values values;
    float distance;
};

Python

class Point3f(Structure):
    _fields_ = [("x", c_float),
                ("y", c_float),
                ("z", c_float)]


class Vector3f(Structure):
    _fields_ = [("x", c_float),
                ("y", c_float),
                ("z", c_float)]


class Values(Structure):
    _fields_ = [("position", Point3f),
                ("velocity", Vector3f)]

    def __init__(self, p, v):
        Structure.__init__(self, p, v)


class Orb(Structure):
    _fields_ = [("name", c_char_p),
                       ("mass", c_float),
                       ("radius", c_float),
                       ("density", c_float),
                       ("values", Values),
                       ("distance", c_float)]

    def __init__(self, n, m, r, d, p, v, dd):
        n = c_char_p(n.encode('utf-8'))
        val = Values(p, v)
        super(Orb, self).__init__(n, m, r, d, val, dd)


class PyOrb():
    def __init__(self, n, m, r, d, p, v, dd, c=(0, 0, 0)):
        self.orb = Orb(n, m, r, d, p, v, dd)
        self.pr = pointer(self.orb)


class SolarSystem:
    def __init__(self):
        self.objects = []   #array of PyOrbs
        self.pointers = []
        self.time = None

    def fill_pointers(self):
        prs = []
        for i in range(len(self.objects)):
            prs.append(self.objects[i].pr)
        self.pointers = (POINTER(Orb) * len(self.objects))(*prs)

在 Python 我有一组 PyOrbs 有 orb(ctype 结构) 我试图获得指向 C++ function 的指针数组:

extern "C" void update(Orb **obj, int length) {
    std::cout << "Length: " << length << '\n';
    for (int i = 0; i < length; i++) {
        std::cout << obj[i] << '\n';
        std::cout << obj[i]->mass << '\n';
    }
    obj[0]->mass /= 1000;
};

我称之为 Python:

gpu = cdll.LoadLibrary('./libKernel.so')

    ss = SolarSystem()
    ss.add_orbs()

    for i, p in enumerate(ss.pointers):
        print(ss.pointers[i], ss.objects[i].pr)

    print(ss.pointers[0].contents.mass, ss.objects[0].pr.contents.mass)
    ss.pointers[0].contents.mass /= 1000
    print(ss.pointers[0].contents.mass, ss.objects[0].pr.contents.mass, ss.objects[0].orb.mass)

    gpu.update(ss.pointers, len(ss.pointers))

    print(ss.objects[0].orb.mass)

在终端中,我的 print 和 cout 不匹配。 当我尝试读取 orb[0] 的质量时,我得到不同的数字。 我在 Python 中也得到了错误的地址,但如果我更改其中一个,rest 会更改。 我想问题在于调用 C++ function。 我编译'.so':

nvcc --ptxas-options=-v --compiler-options '-fPIC' -o libKernel.so --shared project.cu

另外终端:

<__main__.LP_Orb object at 0x7f05dd220ec0> <__main__.LP_Orb object at 0x7f05dd2200c0>
<__main__.LP_Orb object at 0x7f05dd220dc0> <__main__.LP_Orb object at 0x7f05dd220640>
<__main__.LP_Orb object at 0x7f05dd220ec0> <__main__.LP_Orb object at 0x7f05dd2205c0>
<__main__.LP_Orb object at 0x7f05dd220dc0> <__main__.LP_Orb object at 0x7f05dd2209c0>
<__main__.LP_Orb object at 0x7f05dd220ec0> <__main__.LP_Orb object at 0x7f05dd220840>
<__main__.LP_Orb object at 0x7f05dd220dc0> <__main__.LP_Orb object at 0x7f05dd2207c0>
<__main__.LP_Orb object at 0x7f05dd220ec0> <__main__.LP_Orb object at 0x7f05dd220140>
<__main__.LP_Orb object at 0x7f05dd220dc0> <__main__.LP_Orb object at 0x7f05dd220a40>
<__main__.LP_Orb object at 0x7f05dd220ec0> <__main__.LP_Orb object at 0x7f05dd2204c0>
<__main__.LP_Orb object at 0x7f05dd220dc0> <__main__.LP_Orb object at 0x7f05dd220c40>
<__main__.LP_Orb object at 0x7f05dd220ec0> <__main__.LP_Orb object at 0x7f05dd220d40>
1.9899999468308077e+30 1.9899999468308077e+30
1.9899999232189753e+27 1.9899999232189753e+27 1.9899999232189753e+27
Length: 11
0x7f05d00e8de0
-0.00587
0x7f05d00e8f30
6.82
0x7f05d0086750
-35.1
0x7f05d0086f90
-30.1
0x7f05d009d810
20.5
0x7f05d009df30
4.6
0x7f05d00ac7b0
6.36
0x7f05d00acfc0
-4.7
0x7f05d00376c0
0.709
0x7f05d0037f00
5.01
0x7f05d0047780
-29.5
1.9899999232189753e+27

Process finished with exit code 0

我知道代码不是很好,而且需要阅读很多,但我真的希望能得到一些帮助。 谢谢!

它是ctypes ,而不是cpptypes ctypes不理解像std::string这样的 C++ 类。 c_char_p表示Orb结构中的一个char* std::string更改为char[MAX_NAME_LEN]数组并在 Python 中使用类型c_char * MAX_NAME_LEN MAX_NAME_LEN。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM