矢量下标超出范围(但不是真的)

时间:2014-04-24 06:09:32

标签: c++ runtime-error stdvector subscript

我使用函数用随机模板填充矢量(使用双精度测试)值:

    template <typename T>
    void setList(vector<T> & theList)
    {
        srand(time(NULL));          

        int howMany, max, min;
        cout << "How many items should be generated in the list? ";
        cin >> howMany;
        cin.ignore();

        cout << "Max value of list? ";
        cin >> max;
        cin.ignore();

        cout << "Min value of list? ";
        cin >> min;
        cin.ignore();

        theList.resize(howMany);

        T randValue;
        for (int i = 0; i < howMany; ++i)
        {
            randValue = (((double) rand() / (double) RAND_MAX) * (max - min)) + min;
            theList[i] = randValue;
        }
    }

该函数在向量中的main中调用:

    vector<double> listA;
    setList(listA);

无论什么价值&#34; howMany&#34;是,当我到达下标howMany-2时,我得到一个超出范围错误的下标。

单步执行调试器,我的索引在下标范围内。

例如,如果用户为howMany输入10,则循环尝试输入

theList[8] = randValue;

抛出错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

我在Solaris环境中尝试过这段代码,但我没有超出范围索引的异常。

这是我的代码:

 template <typename T>
 void setList(std::vector<T> & list)
 {
    srand(time(NULL));

    int howMany, max, min;
    std::cout << "How many items should be generated in the list? ";
    std::cin >> howMany;
    std::cin.ignore();

    std::cout << "Max value of list? ";
    std::cin >> max;
    std::cin.ignore();

    std::cout << "Min value of list? ";
    std::cin >> min;
    std::cin.ignore();

    list.resize(howMany);

    T randValue;
    for (int i = 0; i < howMany; ++i)
    {
       randValue = (((T) rand() / (T) RAND_MAX) * (max - min)) + min;
     list[i] = randValue;
    }
    // I Have added this feature for visualization purposes
    for (int i = 0; i < list.size(); ++i)
    {
       std::cout << "list[" << i << "]=" << list[i] << std::endl;
    }
  }

我的main()看起来像

 int main(int argc, char** argv) {
     std::vector<int> lista;
     lista.clear();
     setList(lista);
 }

我的输出是:

My execution output

顺便提一下,我注意到如果你定义一个整数向量,向量的内容总是最小值。这是因为你需要将中间值转换为double并最终将结果转换为类型T.(在intege类型中,“/”运算符被解释为整数除法。)

你可以这样做。

 for (int i = 0; i < howMany; ++i)
 {
     randValue = static_cast<T>((static_cast<double>((T) rand()) / static_cast<double>((T) RAND_MAX)) * (max - min)) + min;
     list[i] = randValue;
 }

答案 1 :(得分:0)

我的困境的答案由@SingerOfTheFall提供。

具体来说,在调试时获得无意义的错误(在这种情况下,实际上在范围内超出范围)需要测试不同的途径。

如果在不同的编译器中加载显示代码运行正常,则问题不一定是代码。

从头开始重新编译代码(&#34;清理&#34;)代码在这种情况下成功了。