rpd*_*wes 2 c++ pointers reference cython
我通过Cython将Python连接到名为Bullet Physics的C ++库。我有很多工作,但是一个问题困扰着我。这是在多种情况下发生的问题的示例。
Bullet Physics .h文件声明了一个方法,我将其复制并合并到我的cdef中,如下所示:
cdef cppclass btSliderConstraint:
btSliderConstraint *btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA)
Run Code Online (Sandbox Code Playgroud)
问题是如何在对该方法的Cython调用中指定rbA和rbB 引用(&rbA和&rbB)。我有很多指向btRigidBody对象的指针,但是此方法的声明要求参数是引用(除非我弄错了)。
如果我仅尝试为rbA和rbB提供指向btRigidBody对象的指针,则cython编译器会抱怨:
Error compiling Cython file:
------------------------------------------------------------
cdef btRigidBody *b1
cdef btRigidBody *b2
# bs.bodies is an array of pointers to btRigidBody objects, nbi and ji1 are integer indices
b1 = bs.bodies[nbi]
b2 = bs.bodies[ji1]
motor = new btSliderConstraint(b1, b2, tra, trb, 1);
^
------------------------------------------------------------
fun4.pyx:922:41: Cannot assign type 'btRigidBody *' to 'btRigidBody'
Run Code Online (Sandbox Code Playgroud)
我的强制转换或取消引用等尝试均未完成这项工作。在纯C ++中,这似乎很容易做到,但是在Cython中,我尝试过的所有方法似乎都没有效果。
如果我能够简单地声明btRigidBody类型的变量,如下所示:
cdef btRigidBody rbA
那么我相信我可以将其作为参数传递,并且编译器不会抱怨。我在其他情况下也可以这样做。但是,我不想在这里这样做,因为我已经有一个指向要作为参数传递的对象的指针,而且,以这种方式进行操作将要求btRigidBody对象和库没有提供不带任何参数的构造函数,并且出于可维护性的原因,我不想对库进行修改。
因此,如何在Cython中将指针转换为我拥有的btRigidBody对象以及所需的btRigidBody引用?
编辑:
*取消对指针的引用的明显用法在Cython中不起作用(尽管我认为它将在C ++中起作用)。在Cython中,它给出了许多令人困惑的错误:
Error compiling Cython file:
------------------------------------------------------------
...
cdef btRigidBody *b1
cdef btRigidBody *b2
# bs.bodies is an array of pointers to btRigidBody objects, nbi and ji1 are integer indices
b1 = bs.bodies[nbi]
b2 = bs.bodies[ji1]
motor = new btSliderConstraint(*b1, *b2, tra, trb, 1);
^
------------------------------------------------------------
fun4.pyx:922:34: Non-trivial keyword arguments and starred arguments not allowed in cdef functions.
Error compiling Cython file:
------------------------------------------------------------
...
cdef btRigidBody *b1
cdef btRigidBody *b2
# bs.bodies is an array of pointers to btRigidBody objects, nbi and ji1 are integer indices
b1 = bs.bodies[nbi]
b2 = bs.bodies[ji1]
motor = new btSliderConstraint(*b1, *b2, tra, trb, 1);
^
------------------------------------------------------------
fun4.pyx:922:38: Cannot convert 'btRigidBody *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
cdef btRigidBody *b1
cdef btRigidBody *b2
# bs.bodies is an array of pointers to btRigidBody objects, nbi and ji1 are integer indices
b1 = bs.bodies[nbi]
b2 = bs.bodies[ji1]
motor = new btSliderConstraint(*b1, *b2, tra, trb, 1);
^
------------------------------------------------------------
fun4.pyx:922:43: Cannot convert 'btRigidBody *' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
cdef btRigidBody *b1
cdef btRigidBody *b2
# bs.bodies is an array of pointers to btRigidBody objects, nbi and ji1 are integer indices
b1 = bs.bodies[nbi]
b2 = bs.bodies[ji1]
motor = new btSliderConstraint(*b1, *b2, tra, trb, 1);
^
------------------------------------------------------------
fun4.pyx:922:48: Cannot convert 'btTransform' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
cdef btRigidBody *b1
cdef btRigidBody *b2
# bs.bodies is an array of pointers to btRigidBody objects, nbi and ji1 are integer indices
b1 = bs.bodies[nbi]
b2 = bs.bodies[ji1]
motor = new btSliderConstraint(*b1, *b2, tra, trb, 1);
^
------------------------------------------------------------
fun4.pyx:922:53: Cannot convert 'btTransform' to Python object
Error compiling Cython file:
------------------------------------------------------------
...
cdef btRigidBody *b1
cdef btRigidBody *b2
# bs.bodies is an array of pointers to btRigidBody objects, nbi and ji1 are integer indices
b1 = bs.bodies[nbi]
b2 = bs.bodies[ji1]
motor = new btSliderConstraint(*b1, *b2, tra, trb, 1);
^
------------------------------------------------------------
fun4.pyx:922:34: Cannot convert Python object to 'btSliderConstraint *'
Error compiling Cython file:
------------------------------------------------------------
...
cdef btRigidBody *b1
cdef btRigidBody *b2
# bs.bodies is an array of pointers to btRigidBody objects, nbi and ji1 are integer indices
b1 = bs.bodies[nbi]
b2 = bs.bodies[ji1]
motor = new btSliderConstraint(*b1, *b2, tra, trb, 1);
^
------------------------------------------------------------
fun4.pyx:922:34: Storing unsafe C derivative of temporary Python reference
Run Code Online (Sandbox Code Playgroud)
由于Cython的目标是保留Python语法,因此无法使用*进行指针取消引用。而是使用[]。以下是所需的操作:
motor = new btSliderConstraint(bs.bodies [nbi] [0],bs.bodies [ji1] [0],tra,trb,1);