2015-04-02 244 views
1

我在学校做一个组项目,我们正在创建一个2D游戏,我收到一个异常,我不知道什么是什么与...有关。C++未处理的异常:一个无效的参数传递给一个函数,该函数认为无效的参数致命

备注:所有这些都是在调试模式下完成的。

我们有计算碰撞,并增加了矢量力的实体,该代码physicsengine类:

void PhysicsEngine::doPhysicsTick() 
{ 
    vector<vector<unordered_set<Entity*>>> *grid = this->grid.getGrid(); 
    unordered_set<Entity*>* updatable = new unordered_set<Entity*>(); 
    unordered_set<Entity*>* collidable = new unordered_set<Entity*>(); 

    const int &r = CollisionGrid::C_GRID_RADIUS; 

    for (int row = 0; row < grid->size(); row++) 
    for (int col = 0; col < grid->at(row).size(); col++) 
    { 
     collidable->clear(); 

     // put all surrounding grid blocks in a entity list to 
     // check against collision with the current block 

     int rw(row - r > 0 ? row - r : 0); 
     int cl(col - r > 0 ? col - r : 0); 

     for (int rrow = rw; rrow <= row + r && rrow < grid->size(); rrow++) 
     for (int rcol = cl; rcol <= col + r && rcol < grid->at(rrow).size(); rcol++) 
      for (Entity *e : grid->at(rrow).at(rcol)) // It crashes here 
       collidable->insert(e); 

     for (Entity *e : grid->at(row).at(col)) 
     { 
      if (e->isFixed()) 
       continue; 

      e->speed += gravity; 

      eBounds.reBox(e->location, e->getSize() + e->speed); 

      for (Entity *c : *collidable) 
       if (isOverlapping(eBounds, Box(c, c->getSize())) && e != c) 
        doCollision(e, c); 

      updatable->insert(e); 
     } 
    } 

我们有一个管理我们存储我们的实体碰撞检查电网(独立collisiongrid类,所以我们不必检查所有内容)

collisionGrid及其基础vector是在physicsengine的构造函数名为PhysicsEngine::PhysicsEngine(World *world) : grid(world)时创建的。但由于某种原因,只有第一次打勾,我才看到向量网格指向了填充可碰撞的循环内部的一些不具有可扩展性的东西(大小可能非常大而且很大)。

它抛出的错误是在标题中。如果我在它周围放置一个catch块,它会随机在一些C++类库中随机(每次不同的文件)碰撞某处其他地方

由于某种原因,它在我们的gameloop类中崩溃' physicsengine)析构函数,如果我不评论我放在那里的东西。

Gameloop::~Gameloop() 
{ 
    //if(t) // t = #include <thread> 
    // delete t; 
} 

我们不允许使用任何图书馆外的Win32 API和一些默认的C++库


编辑:我加了一些照片(和解开unordered_sets的动态分配)

它应该显示:

correct grid

它有时会显示在第一跳: (注意指针如何是相同的,前两个拍在同一个运行期间进行)

enter image description here

它显示了在第一跳其他时间:

enter image description here

+1

是否有任何动态分配STL容器的原因? – 2015-04-02 11:44:22

+0

@DavidHaim我希望能够在堆栈上节省一些空间,虽然我甚至不确定它是否会这样做(我们的老师并没有给我们提供关于这个主题的很多信息) – Gelunox 2015-04-02 11:46:00

+5

你不会节省那么多,因为大多数容器('std :: array'是一个例外)无论如何都会动态分配其内容。容器类本身很少超过几个指针。内容不在堆栈中。 – JBL 2015-04-02 11:49:11

回答

1

,当我看到所有没有缩进,也不括号那些for我畏缩。

你的程序是否处理任务?因为this可能会解决你的问题在那种情况下(那些例外从不在适当的时间崩溃程序!)

如果不是,那么你需要调试一些更多的程序。像打印rrowrrcolgrid->size()grid->at(rrow)->size每次之前它崩溃的行。

但我的钱在代码的并发/内存管理方面。事实上,它在删除部分的析构函数中崩溃,这让我觉得也许你正在处理已经在别处删除的项目,或者没有采取适当的措施的同时处理项目。在你的截图中,你有一堆size=???,这可能意味着你的项目/实例被删除,你的指针指向可用内存,导致在你的循环中访问它时导致崩溃。这是一个很难解决的错误。

此外,您应该能够在调试器中访问异常的参数,如果可以的话,也许您可​​以发布其所有内容?

+0

我可能没有在这方面很清楚,但是,如果我取消注释析构函数中的删除并让它运行,那么会弹出错误消息,但它并未真正破坏程序(它很快乐地继续进行迭代和滴答作业)这就是为什么我特别说它只发生在第一次打勾。并且在第一次错误打勾后发生的所有事情都是正常的预期行为。对不起,我查看一个行列double,因为我只看到一个循环,这对我来说更具可读性。 – Gelunox 2015-04-02 12:34:28

+0

显然你的钱是对的,因为我在某处做了一个'Gameloop g(世界)',它只是去了,死了,仍然没有解释为什么它继续前进,但谢谢指出我在正确的方向! – Gelunox 2015-04-02 12:47:36

+0

@WhiteNightFury如果可以提供帮助,我在Xbox编程中遇到了类似的问题,我必须确保所有对异步API的调用都必须具有create_task(call_ret_value).then(...)'try/catch对于抛出的任何异常。无论如何,异常的'disassembleMe'参数应该指向问题,就像我在答案中的链接一样。 – coyotte508 2015-04-02 12:55:20

相关问题