【问题标题】:Program causes infinite loop程序导致无限循环
【发布时间】:2014-12-16 01:30:31
【问题描述】:

这是有问题的程序。为什么会导致死循环?

#include <vector>
#include <iostream>
using namespace std;

class Workshop
{
public:
    int pictureFrames( vector<int> pieces );
};

int Workshop::pictureFrames( vector<int> pieces )
{
    int count = 0;

    for ( int i = 0 ; i < pieces.size() - 2 ; i++ )
    {
        for ( int j = i + 1; j < (pieces.size() - 1) ; j++ )
        {
            for ( int k = j + 1; k < (pieces.size()); k++ )
            {
                bool possible = (pieces[i] + pieces[j] > pieces[k]) &&
                                (pieces[j] + pieces[k] > pieces[i]) &&
                                (pieces[k] + pieces[i] > pieces[j]);
                if ( possible )
                    count++;
            }
        }
    }
    return count;
}

void main()
{
    Workshop w;
    vector<int> pieces;
    pieces.push_back( 100 );
    w.pictureFrames( pieces );
}

【问题讨论】:

  • 以后,通过突出显示并按CTRL+K 或缩进四个空格来格式化您的代码。不要用反引号包围每一行。其次,void main isn't a valid signature in C++。第三,由于您使用的是 Visual Studio,因此请利用内置的调试工具(即通过设置断点)来查看程序的故障所在。
  • 你试过调试吗?
  • 您自己尝试过什么解决方法?我建议将调试打印输出放在合适的位置

标签: c++ stl


【解决方案1】:

您是否尝试使用完整的诊断程序对其进行编译?

请看这里:http://coliru.stacked-crooked.com/a/e29de5a6cd9bd21e

main.cpp:15:25: warning: comparison of integers of different signs: 'int' and 'unsigned long' [-Wsign-compare]

for ( int i = 0 ; i < pieces.size() - 2 ; i++ )

                  ~ ^ ~~~~~~~~~~~~~~~~~

[内循环重复两次,投诉void main()]

诊断非常有指导意义。

int 被提升为unsigned long(或任何size_t),并与pieces.size() - 2 相比,由于模运算真的很大强>。

【讨论】:

    【解决方案2】:

    vector 的size() 方法返回size_t,这是一个无符号类型。当你取一个值为1 的无符号类型并从中减去2,你会得到一个非常大的数字。

    如果你把下面这行放在pictureFrames 方法中,你会发现为什么循环需要这么长时间来执行。

    cout << pieces.size() - 2 << endl;,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-27
      • 2021-05-07
      • 2012-08-24
      • 2020-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多