2

box2d の python ラッパーを作成しました。すべてが完璧に動作しますが、boost python によって公開されたメソッド関数を呼び出すと、奇妙な TypeError エラーが発生することがあります。これはランダムな動作であり、毎回発生するわけではありません。

問題の python コード:

try:
    world = body.GetWorld()  # world is b2World instance, body is b2Body instance
    world.DestroyBody(body)  # raise TypeError: 'NoneType' object is not callable
except TypeError:  # catch it, and print some infomation
    print "xxxxx", world  # I got a b2World instance here
    print "xxxxx", sys.getrefcount(world)  # I got a value of 66 here
    print "xxxxx", world.DestroyBody  # I got a bound method object here
    raise

それはすべて大丈夫です。それはどのように起こったのですか?

そして私のラッパーコードの一部:

// [file]: https://github.com/layzerar/box2d-py/blob/master/python/world.cpp
// [project]: https://github.com/layzerar/box2d-py
template<class T>
inline void b2Func_ClearUserData(T& self)
{
    using namespace boost::python;

    xdecref((PyObject*)self.GetUserData());
    self.SetUserData(NULL);
}
inline void b2World_DestroyBody(b2World& self, b2Body* body)
{
    b2Assert(self.GetBodyCount() > 0);
    b2Assert(self.IsLocked() == false);

    b2Func_ClearUserData(*body);
    self.DestroyBody(body);
}
class_<b2World, b2World_W , boost::noncopyable>("b2World")
    //...
    .def("CreateBody", b2World_CreateBody, return_internal_reference<>())
    .def("DestroyBody", b2World_DestroyBody)
    //...
;

私は明らかな間違いを犯しましたか?

4

1 に答える 1

0

数日探索した後、私は答えを見つけました。

私は質問について間違いを犯しています.DestroyBodyによって例外が実際にスローされることはありません. Pythonで書き換えられ、DestroyBody関数で呼び出される仮想関数によってスローされます。

于 2012-12-27T11:21:47.047 に答える