Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;方法需要参考,can';我不能让Cython提供一个 我通过Python将Python接口到一个名为子弹物理的C++库。我有相当多的工作,但有一个问题是困扰我。下面是一个在多个上下文中发生的问题的示例_C++_Pointers_Reference_Cython - Fatal编程技术网

C++;方法需要参考,can';我不能让Cython提供一个 我通过Python将Python接口到一个名为子弹物理的C++库。我有相当多的工作,但有一个问题是困扰我。下面是一个在多个上下文中发生的问题的示例

C++;方法需要参考,can';我不能让Cython提供一个 我通过Python将Python接口到一个名为子弹物理的C++库。我有相当多的工作,但有一个问题是困扰我。下面是一个在多个上下文中发生的问题的示例,c++,pointers,reference,cython,C++,Pointers,Reference,Cython,Bullet Physics.h文件声明了一个方法,我将其复制并合并到cdefs中,如下所示: cdef cppclass btSliderConstraint: btSliderConstraint *btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearR

Bullet Physics.h文件声明了一个方法,我将其复制并合并到cdefs中,如下所示:

cdef cppclass btSliderConstraint:
    btSliderConstraint *btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA)
问题是如何在对该方法的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'
我的任何尝试都没有成功。在C++中,这似乎很容易做到,但是在Cython,我尝试的任何东西似乎都不起作用。 如果我能够简单地声明一个类型为btRigidBody的变量,如下所示:

cdef cppclass btSliderConstraint:
    btSliderConstraint *btSliderConstraint(btRigidBody& rbA, btRigidBody& rbB, const btTransform& frameInA, const btTransform& frameInB, bool useLinearReferenceFrameA)
cdef B刚体rbA

然后,我相信我可以将其作为一个参数传递,编译器不会抱怨。我在其他情况下也这样做,而且效果很好。但是,我不想在这里这样做,因为我已经有了一个指向我想作为参数传递的对象的指针,而且,以这种方式执行操作将要求BtrigBody对象存在一个“nullarity构造函数”,并且库不提供不带参数的构造函数,出于可维护性的原因,我不想对库进行修改


那么,在Cython中,如何将指针转换为我所拥有的B刚体对象,转换为我所需要的B刚体引用

编辑:

显然使用*来取消指针引用在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

由于Cython的目标是保留Python语法,因此无法使用*进行指针解引用。而是使用[]。以下内容符合要求:


电机=新的btSliderConstraint(bs.Body[nbi][0],bs.Body[ji1][0],tra,trb,1)

“那么,我如何才能将指针转换为我拥有的B刚体对象,转换为B刚体引用”取消对它们的引用?如何,尼尔?我试过很多东西。我将用一个例子来编辑问题。使用
操作符*
编辑问题,显示完成此操作时发生的情况。(我已经试过了,还有很多其他的东西。)来自Cython文档:“Cython对C类型使用普通的C语法,包括指针……请注意Cython使用数组访问进行指针解引用,因为*x不是有效的Python语法”。。。我想我终于解决了这个问题。