矢量迭代器(分段故障)

Vector Iterator (Segmentation fault)

本文关键字:故障 分段 迭代器      更新时间:2023-10-16

我设计了一个程序,从CSV文件中读取数据,该文件包含实时更新气象中心的信息。

我现在正在将某些职责划分为多个功能,我需要打印平均风速&特定年份每个月的辐射。样本输入:{年份}2016年

样本输出:{月、平均风速、平均辐射}196.4年1月5日200.3年2月4日。。。等

我的程序被设置为"WindData"的向量,它包含不同的类,如"Date"、"Time"answers"Time";风速数据。

以下功能是我遇到的问题:

void averageWind(int yearNum, std::vector<WindData>& windlog)
{
std::string month[12] = {"January", "February", "March", "April", "May", "June",
"July", "September", "October", "November", "December"};
int monthCount = 0, monthNum[12] = {0}, monthAverage[12] = {0};
int dayCount[12] = {0}, totalWindSpeed[12] = {0}, totalRadiation[12] = {0}, mWindAverage[12] = {0};
std::vector<WindData>::iterator iter;
for(iter = windlog.begin(); iter != windlog.end(); iter++)
{
if(iter->getYear() == yearNum)
{
for(int i = 0;  i < 12; i++)
{
while((iter->getMonth()-1) == i)
{
dayCount[i]++;
totalWindSpeed[i] += iter->getSpeed();
}
std::cout << "Wind Speed: " << totalWindSpeed[i] << std::endl;
std::cout << "Day Count: " << dayCount[i] << std::endl;
mWindAverage[i] = (totalWindSpeed[i] / dayCount[i]);
//std::cout << mWindAverage[i];
//std::cout << month[i];
}
}

}

}

这显然是不完整的,打印方法只是为了测试目的,我的问题是totalWindSpeed和dayCount都产生了0。我试图调试代码,以确定哪里出了问题,迭代器本身似乎有问题,但以前在我的主函数中使用它时,这种方法是有效的。

错误如下:

程序接收到信号SIGSEGV,分段故障。

是什么原因导致的?我读过关于延迟迭代器等的文章,但从我所能知道的情况来看,它的设置是正确的。

如果没有其他信息,我会这样做。

for (WindData& windData : windlog) {
if (windData.getYear() == yearNum) {
int i = windData.getMonth() - 1;
totalWindSpeed[i] += windData.getSpeed();
dayCount[i]++;
}
}
for (int i = 0; i < 12; i++) {
// If each month appears only once, this may go into the previous loop.
mWindAverate[i] = totalWindSpeed[i] / dayCount[i];
}

您的第一个问题是:

mWindAverage[i] = (totalWindSpeed[i] / dayCount[i]);

对于i天的大多数值,Count[i]为零。我想你的分段错误来自这里。您应该首先测试要除以的值是否为零。

第二个问题是

for(int i = 0;  i < 12; i++)

你不必再重复几个月。您只需要在使用迭代器读取数据时添加到正确的月份。请参阅上面的另一个答案(也不测试0的除法!!)。您的代码变得异常复杂。