我正在编写一个从文本文件中读取数据的程序,以各种方式对数据进行排序,然后将排序后的数据用于其他计算。让我说在int main(){ }
中有一个包含许多其他for循环的大型for循环,并且我发布的代码段只是主要循环中的许多for循环中的一个。
for(t=(compare.t - 1000)*2 - 12 ;t< ( (compare.t - 1000)*2 + 12 /);t++){
rank.push_back(vector <int>() );p++;
for(ii=111;ii<2489;ii++){
if(M_screened[a][ii].size()>0){
if( fabs(M_screened[a][ii][0].t-(t*0.5 + 1000.0)) <0.257 ){
cout<<"ii = "<<ii<<" t = "<<t<<" sizeof(rank) = "<<rank.size()<<" p = "<<p;
cout<<" rank["<<p<<"].size() = "<<rank[p].size()<<endl;
cout<<" "<<endl;
cout<<"address = "<<&rank[p][rank[p].size()-1];
rank[p].push_back(ii);
cout<<" "<<endl;
}
}
}
foutT<<t*0.5 + 1000<<" "<<frequency[a][t]<<endl;} //end t-loop
所有cout
语句都只是我自己的错误检查过程的一部分。此外,包含上述代码段的大型for循环能够在第三次(每次)崩溃之前运行2次迭代。
基本上我把它缩小到了就是在push_back()函数上崩溃了。崩溃时的参数值:
t=177, p = 10, ii = 873, sizeof(rank) = 11, rank[10].size() = 1
以下是我从Microsoft Visual Studio收到的错误消息:
Unhandled exception at 0x0000000077993290 (ntdll.dll) in Muon_fitting7_7_2014_statistics.exe: 0xC0000005: Access violation reading location 0x0000038085FFA1E8.
如果我能提供任何其他信息,请告诉我。
答案 0 :(得分:0)
我假设你在声明时将P初始化为零或某些此类事情,这实际上是你的问题。
for(t=(compare.t - 1000)*2 - 12 ;t< ( (compare.t - 1000)*2 + 12 /);t++)
{
rank.push_back(vector <int>() );p++;
for(ii=111;ii<2489;ii++)
{
if(M_screened[a][ii].size()>0){
if( fabs(M_screened[a][ii][0].t-(t*0.5 + 1000.0)) <0.257 ){
rank[p].push_back(ii);
}
}
}
}
首先,排名没有元素,然后你推回并增加p。现在排名为1元素,但你需要使用rank [p-1]来访问它,因为p已经是1.或者将p初始化为-1以启动,所以当你递增它时,它为零。 Vector []访问基于零。
所以,试试这个:
int p = -1;
for(t = ((compare.t - 1000)*2 - 12);t < ((compare.t - 1000)*2 + 12);++t)
{
rank.push_back(vector <int>() );
++p;
for(ii=111;ii<2489;++ii)
{
if (M_screened[a][ii].size() > 0)
{
if (fabs(M_screened[a][ii][0].t-(t*0.5 + 1000.0)) < 0.257)
{
rank[p].push_back(ii);
}
}
}
}