Этот итератор не повторяется, что не так? - PullRequest
1 голос
/ 02 декабря 2010

Проблема в том, что итератор не выполняет итерации по циклу. Я не знаю почему. #include, как обычно, в шапке.

#include "neutronFileReader.h"

using namespace std ;

neutronFileReader::neutronFileReader()
{
}

list<vector<float> > neutronFileReader::spectrum(char* filename)
{
    ifstream fin(filename) ;
    string binhi, binlo ;
    list<vector<float> > neutronSpectrum ;
    list<vector<float> >::iterator nS ;
    vector<float> EnergyProbability ;

    while(!fin.eof())
    {
        getline(fin, binlo, ' ') ;                        //get the binlo string
        cout << "binlo: "<<binlo << endl ;
        getline(fin, binhi, ' ') ;                        //get the binhi string
        cout<<"binhi: "<<binhi<<endl ;
        EnergyProbability.push_back(atof(binhi.c_str())+(atof(binhi.c_str()) - atof(binlo.c_str()))/2) ;    //store middle of bin as emission Energy
        getline(fin, binlo) ;                            //try not to waste memory space
        cout<<"prob: "<<binlo<<endl ;
        EnergyProbability.push_back(atof(binlo.c_str())) ;    //store emnission probability
        neutronSpectrum.push_back(EnergyProbability) ;    //put the vector in the list
        //cout<<neutronSpectrum<<endl ;
    }


    for(nS = neutronSpectrum.begin() ; nS != neutronSpectrum.end() ; nS++)  //go through the neutron spectrum
    {
        EnergyProbability = (*nS) ;
        cout << "binval: " << EnergyProbability[0] << " " << "binProb: " << EnergyProbability[1] << endl ;
        cout << "binval: " << (*nS)[0] << ", binprob: " << (*nS)[1] << ", memadd: " << &nS << endl ;          // print energy & prob to screen
    }

    return neutronSpectrum ;
} 

в любом случае, некоторая помощь здесь будет принята с благодарностью, переместив ее в цикл while, да, это все тестирование ошибок, но это довольно важный фрагмент кода. Ура, ребята, всегда учусь.

Ответы [ 4 ]

1 голос
/ 02 декабря 2010

Вы не очищаете EnergyProbability между входными циклами.(* ns) [0], следовательно, видит избыточно сохраненные значения с первого входа, игнорируя новые значения, которые фактически находятся в [2], затем [4] и т. д. Просто добавьте EnergyProbability.clear() перед тем, как читать в него больше значений.

1 голос
/ 02 декабря 2010

Вы уверены, что заполняете массив neutronSpectrum, поэтому он не пустой?Пожалуйста, убедитесь, добавив это в конец:

if (neutronSpectrum.empty())
  cerr << "error: empty neutronSpectrum" << endl;

Возможно, есть проблема с вашим входным файлом (он пустой или нечитаемый), так что в итоге вы ничего не добавите к neutronSpectrumПросто чтобы убедиться, пожалуйста, добавьте несколько операторов cout в ваш цикл while.Также стоит проверить fin.error() после цикла while:

if (fin.error())
  cerr << "error: error reading input file: " filename << endl;
0 голосов
/ 02 декабря 2010

Хорошо, проверили все вышеперечисленное, одна проблема заключалась в том, что я не очищал вектор EnergyProbability на каждой итерации цикла while (не то, чтобы он был пустым), это создавало все больший и больший вектор, который перемещался назад из списка каждый раз, поэтому выводились первые два элемента указанного в списке элемента (вектор), и они были одинаковыми каждый раз (очевидно, я дурак). Итак, теперь я знаю, что проблема в том, что итератор не распознает, что он достиг конца списка, и, когда он это делает, он выбрасывает нулевой указатель, я думаю. код здесь:

#include "neutronFileReader.h"

using namespace std ;

neutronFileReader::neutronFileReader()
{
}

list<vector<float> > neutronFileReader::spectrum(char* filename)
{
ifstream fin(filename) ;
string binhi, binlo ;
list<vector<float> > neutronSpectrum ;
list<vector<float> >::iterator nS ;
vector<float> EnergyProbability ;

while(!fin.eof())
{
    EnergyProbability.clear() ;
    getline(fin, binlo, ' ') ;                      //get the binlo string
    cout << "binlo: "<<binlo << endl ;
    getline(fin, binhi, ' ') ;                      //get the binhi string
    cout<<"binhi: "<<binhi<<endl ;
    EnergyProbability.push_back(atof(binhi.c_str())+(atof(binhi.c_str()) - atof(binlo.c_str()))/2) ;    //store middle of bin as emission Energy
    getline(fin, binlo) ;                           //try not to waste memory space
    cout<<"prob: "<<binlo<<endl ;
    EnergyProbability.push_back(atof(binlo.c_str())) ;  //store emnission probability
    cout << EnergyProbability[0] << ":" << EnergyProbability[1] << endl ;
    neutronSpectrum.push_back(EnergyProbability) ;  //put the vector in the list
}

for(nS = neutronSpectrum.begin() ; nS != neutronSpectrum.end() ; nS++)  //go through the neutron spectrum
{
    EnergyProbability = (*nS) ;
    cout << &neutronSpectrum.begin() << " : " << &nS << " : " << &neutronSpectrum.end() << endl ;         // print energy & prob to screen
}


return neutronSpectrum ;
}

вывод:

0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8  
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 
0x28fbcc : 0x28fba8 : 0x28fbc8 

тогда code :: blocks должен понимать, что находится в бесконечном цикле, где ничего не меняется, и выходит из кода.

ура, ребята

0 голосов
/ 02 декабря 2010

Если в конце цикла for ничего не напечатано, neutronSpectrum, вероятно, пусто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...