我知道这个问题已被问过很多次了。但是,就我而言,错误并不总是存在,所以我认为它可能会有所不同。我使用的是C ++,Visual Studio 2013,Windows 7 x64。
以下是相关代码:
void writeDATAToFile(const char *fname, string title, const VecDoub& spec_x, const VecDoub& spec_y, const VecDoub& freq)
{
ofstream of;
of.open(fname, ios_base::out);
if (!of.is_open())
{
return;
}
of << "somename" << endl;
of << "WAVES/S" << "\t" << title << endl;
of << "BEGIN" << endl;
for (int i=0; i<spec_x.size(); i++)
{
of << spec_x[i] << "\t\t\t" << spec_y[i] << "\t\t\t" << freq[i]<<endl;
}
of << "END" << endl;
of.close();
}
该函数应该写入频谱数据(在程序中先前计算)并将其写入文件。一些频谱数据不会导致问题,有些会。错误在for循环中。 这是错误窗口:
答案 0 :(得分:2)
您将3个向量传递给您的函数:
const VecDoub& spec_x, const VecDoub& spec_y, const VecDoub& freq
但你永远不会检查它们是否具有相同的尺寸。
在你的循环中(不是你在问题中所说的&#34;第二个&#34;循环,你发布的代码中只有一个循环),你重复{{1并使用相同的索引spec_x
来索引其他两个向量。
如果您的另外两个向量中的一个或两个的大小小于i
,该怎么办?然后你将索引越界,这会导致你看到的错误。
答案 1 :(得分:1)
错误消息明确表示它正在尝试读取不应该的内容。
你编码循环因此:
for (int i=0; i<spec_x.size(); i++)
{
of << spec_x[i] << "\t\t\t" << spec_y[i] << "\t\t\t" << freq[i]<<endl;
}
这假定spec_x
,spec_y
和freq
的大小相同。
注意 - 调试器正试图帮助您。如果你点击“break”它会给你一个调用堆栈,然后你应该能够确切地看到导致问题的变量。