【问题标题】:How to solve 'vector subscript out of range' error?如何解决“向量下标超出范围”错误?
【发布时间】:2018-12-13 17:28:42
【问题描述】:

我正在尝试使用 C++ 学习神经网络,并找到了有关数字识别的教程,但是当我运行代码时,我收到一条错误消息,提示“调试断言失败,向量下标超出范围”。显然问题出在loadTraining 函数中,但不知道如何修改它以消除错误。

void loadTraining(const char *filename, vector<vector<double>> &input, vector<vector<double>> &output) 
{
    int trainingSize = 946;
    input.resize(trainingSize);
    output.resize(trainingSize);

    ifstream file(filename);
    if(file) 
    {
        string line;
        int n;
        for (int i=0 ; i<trainingSize ; i++) // load 946 examples
        {
            for (int h=0 ; h<32 ; h++) // 'images' are 32*32 pixels
            {
                getline(file, line);
                for (int w=0 ; w<32 ; w++)
                {
                    input[i].push_back(atoi(line.substr(w,1).c_str()));
                }
            }
            getline(file, line);
            output[i].resize(10); // output is a vector of size 10
            n = atoi(line.substr(0,1).c_str());
            output[i][n] = 1; // set index that represent the number to 1, other are automatically 0 because of the resize()
        }
    }
    file.close();
}

该文件由 32*32 的二进制数字数组组成。 This is one training exmple.

我正在使用 Visual Studio 2013。

【问题讨论】:

  • getlineatoi 可能会失败,您确定它们不会失败吗?
  • 您可以在发生这种情况的特定时间中断,并使用调试器找出根本原因。事实上,这不适合 Stack Overflow。由于i 看起来不错,我怀疑n 有问题(即大于或等于十,或负数)。
  • substr(...).c_str() 返回一个指向死临时子字符串的悬空指针。
  • "该文件由 32*32 个二进制数字数组组成" 那么为什么在读取它们时使用字符串转整数函数?您的意思是“文件由 32 行组成,每行 32 位”?
  • 你能告诉我们其中一个文件的内容吗?

标签: c++ neural-network pattern-recognition


【解决方案1】:

考虑使用std::stoi 而不是atoi。将std::stoi 包含在trycatch 块中以检查转换问题。还要检查n &gt;= 0 &amp;&amp; n &lt; 10 是否可以解决潜在的下标错误。

【讨论】:

  • 当使用stoi 时,我得到“std::invalid_argument: stoi: no conversion”类型的异常。当使用atoi 时,我得到“std::out_of_range 类型的异常:basic_string。n 等于零。
  • 我建议你先用if getline(file, line)检查数据是否被正确读取。还输出行以查看读取的数据是否符合您的预期。
猜你喜欢
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
相关资源
最近更新 更多