【问题标题】:For loop just... not starting?For循环只是......没有开始?
【发布时间】:2011-06-19 18:19:58
【问题描述】:

这是一个奇怪的问题。我有一个 void 函数,它执行一个 for 循环,没有别的,但是 for 循环永远不会启动,即使该函数正在被调用。这是函数:

void Cell::Consolidate()
{
    cout << "Consolidating (outside)...\n";
    for(int i = 0; i < m_Tiles.size(); ++i)
    {
        cout << "Consolidating (inside)...\n";
        int row = m_Tiles[i]->GetRow();
        int col = m_Tiles[i]->GetCol();
        //Check below.
        if((*m_pTileMap)[row + 1][col].pParentCell != this)
        {
            m_EdgeTiles.push_back(m_Tiles[i]);
            m_Tiles[i]->SetColor(sf::Color(100, 100, 100));
            bool newNeighbor = true;
            for(int j = 0; j < m_Neighbors.size(); ++j)
            {
                if(m_Neighbors[j] == (*m_pTileMap)[row + 1][col].pParentCell)
                {
                    newNeighbor = false;
                    break;
                }
            }
            if(newNeighbor)
            {
                m_Neighbors.push_back((*m_pTileMap)[row + 1][col].pParentCell);
            }
        }
        //Check above.
        else if((*m_pTileMap)[row - 1][col].pParentCell != this)
        {
            m_EdgeTiles.push_back(m_Tiles[i]);
            m_Tiles[i]->SetColor(sf::Color(100, 100, 100));
            bool newNeighbor = true;
            for(int j = 0; j < m_Neighbors.size(); ++j)
            {
                if(m_Neighbors[j] == (*m_pTileMap)[row - 1][col].pParentCell)
                {
                    newNeighbor = false;
                    break;
                }
            }
            if(newNeighbor)
            {
                m_Neighbors.push_back((*m_pTileMap)[row - 1][col].pParentCell);
            }
        }
        //Check the right.
        else if((*m_pTileMap)[row][col + 1].pParentCell != this)
        {
            m_EdgeTiles.push_back(m_Tiles[i]);
            m_Tiles[i]->SetColor(sf::Color(100, 100, 100));
            bool newNeighbor = true;
            for(int j = 0; j < m_Neighbors.size(); ++j)
            {
                if(m_Neighbors[j] == (*m_pTileMap)[row][col + 1].pParentCell)
                {
                    newNeighbor = false;
                    break;
                }
            }
            if(newNeighbor)
            {
                m_Neighbors.push_back((*m_pTileMap)[row][col + 1].pParentCell);
            }
        }
        //Check the left.
        else if((*m_pTileMap)[row][col - 1].pParentCell != this)
        {
            m_EdgeTiles.push_back(m_Tiles[i]);
            m_Tiles[i]->SetColor(sf::Color(100, 100, 100));
            bool newNeighbor = true;
            for(int j = 0; j < m_Neighbors.size(); ++j)
            {
                if(m_Neighbors[j] == (*m_pTileMap)[row][col - 1].pParentCell)
                {
                    newNeighbor = false;
                    break;
                }
            }
            if(newNeighbor)
            {
                m_Neighbors.push_back((*m_pTileMap)[row][col - 1].pParentCell);
            }
        }
    }
}

当我运行程序时,"Consolidating (outside)...\n" 被发送到 cout,但 "Consolidating (inside)...\n" 没有。循环中应该发生的任何事情实际上都不会发生(例如 SetColor() 调用不做任何事情,如果我将事情发送到 cout 循环中的其他任何地方也不会发生任何事情),所以我只能假设循环根本没有开始。为什么不?这是什么原因造成的?

【问题讨论】:

  • 是什么阻止您调试代码并分析发生了什么?

标签: c++ loops for-loop


【解决方案1】:
i < m_Tiles.size()

这个循环条件在进入循环时被检查,不仅在每次迭代之后。如果你的 m_Tiles 向量是空的,那么你就没有循环了。

【讨论】:

  • 该死...这意味着问题出在其他地方。在将我的 Python 代码移植到 C++ 时,我需要更加注意。惭愧,我以为我偶然发现了 C++ 的一些深刻而深奥的特质。 :P
【解决方案2】:

m_Tiles.size() 很可能返回负值或零值。

【讨论】:

  • 什么是负尺寸?如果有的话,它是 0。
  • 如果是个人手工课,是可以的。
  • 不,负尺寸没有任何意义。
  • 我会杀死任何为代表大小的东西返回负值的人。以为我会说得很好。
  • @Marlon:只要要求size_t 用于任何代表尺寸的东西,就不会是负数。 :)
猜你喜欢
  • 2021-10-18
  • 2014-09-01
  • 2012-08-31
  • 2019-12-25
  • 2012-12-12
  • 2021-12-18
  • 1970-01-01
  • 2019-05-27
  • 2017-09-16
相关资源
最近更新 更多