C++ 向量迭代器(分段错误)

C++ 向量迭代器(分段错误),c++,vector,iterator,C++,Vector,Iterator,我设计了一个程序,从包含实时更新气象中心信息的CSV文件中读取数据 我现在正在将某些职责划分为多个功能,我需要打印指定年份每个月的平均风速和辐射。 示例输入: {Year} 2016年 样本输出: {月,平均风速,平均辐射} 196年1月5日5时5分 二月份,4200.3 ... 等等 我的程序设置为“WindData”的向量,其中包含不同的类,如“日期”、“时间”和风速数据 以下函数是我遇到的问题: void averageWind(int yearNum, std::vector<Wi

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

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

样本输出: {月,平均风速,平均辐射} 196年1月5日5时5分 二月份,4200.3 ... 等等

我的程序设置为“WindData”的向量,其中包含不同的类,如“日期”、“时间”和风速数据

以下函数是我遇到的问题:

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];
            }

        }


    }


}
void averageWind(int dearneum、std::vector和windlog)
{
std::string month[12]={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”,
“七月”、“九月”、“十月”、“十一月”、“十二月”};
int monthCount=0,monthNum[12]={0},monthAverage[12]={0};
int dayCount[12]={0},totalWindSpeed[12]={0},totalRadiation[12]={0},mWindAverage[12]={0};
std::vector::iter;
对于(iter=windlog.begin();iter!=windlog.end();iter++)
{
if(iter->getYear()==um)
{
对于(int i=0;i<12;i++)
{
而((iter->getMonth()-1)==i)
{
日计数[i]++;
总风速[i]+=iter->getSpeed();
}

如果没有额外的信息,我会这样做

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];
}
for(WindData和WindData:windlog){
if(windData.getYear()==um){
int i=windData.getMonth()-1;
totalWindSpeed[i]+=windData.getSpeed();
日计数[i]++;
}
}
对于(int i=0;i<12;i++){
//如果每个月只出现一次,则可能进入上一个循环。
mWindAverate[i]=总风速[i]/日数[i];
}

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

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];
}
for(WindData和WindData:windlog){
if(windData.getYear()==um){
int i=windData.getMonth()-1;
totalWindSpeed[i]+=windData.getSpeed();
日计数[i]++;
}
}
对于(int i=0;i<12;i++){
//如果每个月只出现一次,则可能进入上一个循环。
mWindAverate[i]=总风速[i]/日数[i];
}

您的第一个问题是:

mWindAverage[i] = (totalWindSpeed[i] / dayCount[i]);
对于i dayCount[i]的大多数值,它都是零。我希望您的分段错误来自这里。您应该首先测试要除以的值不是零

第二个问题是这个

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

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

您的第一个问题是:

mWindAverage[i] = (totalWindSpeed[i] / dayCount[i]);
对于i dayCount[i]的大多数值,它都是零。我希望您的分段错误来自这里。您应该首先测试要除以的值不是零

第二个问题是这个

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

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

您能提供调用此函数的代码吗?您还应该在调试器中运行并找到segfault发生的位置使用调试器找到程序segfault
的确切位置((iter->getMonth()-1)==i)
对我来说看起来非常危险。如果
iter
i
都没有在循环中递增,你的程序可能永远不会跳出循环。同意@DafangCao。如果while条件为真,那么
i
iter
都不会在循环中被更改。你只有11个月的时间,你将错过8月:D。但是在如果你修复了这个问题,你仍然需要修复上面提到的@DafangCao。你能提供调用这个函数的代码吗?你还应该在调试器中运行并找到segfault发生的位置使用调试器找到程序segfaults
while((iter->getMonth()-1)==i)的确切位置
对我来说看起来非常危险。如果
iter
i
都没有在循环中递增,你的程序可能永远不会跳出循环。同意@DafangCao。如果while条件为真,那么
i
iter
都不会在循环中被更改。你只有11个月的时间,你将错过8月:D。但是在如果你解决了这个问题,你仍然需要解决@DafangCao上面提到的问题。我得到以下错误:错误:在“:”标记之前应该有不合格的id |与行相关(auto-WindData:winlog)我以前从未使用过auto,所以我不确定它是如何工作的。@MichaelBell编辑:
auto
在这种情况下是类型
WindData&
。如果您的编译器是C++11之前的版本,它可能既不支持
auto
也不支持
for
循环的增强型
。如果是这种情况,您的解决方案已经有了正确的语法。谢谢!您的代码看起来像是为了工作,你能告诉我为什么我的算法会给我这样一个错误吗?@MichaelBell很抱歉这么晚才回复。原始代码中的
while
循环可能会导致整数溢出,也就是说。整数除以零也是未定义的行为AFAIK(很好,抓住Cristi!)。因此,我无法确定您获得segfault的原因。我得到以下错误:错误:在“:”标记之前应为非限定id |与(自动WindData:winlog)的行相关我以前从未使用过auto,所以我不确定它是如何工作的。@MichaelBell编辑:
auto
在这种情况下是类型
WindData&
。如果您的编译器是C++11之前的版本,它可能既不支持
auto
也不支持
for
循环的增强型
。如果是这种情况,您的解决方案已经有了