2010-12-02 2 views
1

Problem ist, dass der Iterator nicht durch die Schleife iteriert. Ich weiß nicht warum. #includes sind in der Kopfzeile, wie es meine Gewohnheit ist.Dieser Iterator iteriert nicht, was ist falsch?

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

wie auch immer, hier etwas Hilfe würde sehr geschätzt wird, hat es in eine while-Schleife bewegt, ja das ist alles Testen Fehler, aber es ist ein ziemlich wichtiges Stück Code. Prost Leute, lernt immer.

+0

Haben Sie versucht, zuerst die Größe Ihrer Liste auszudrucken? Nur um sicherzustellen, dass Sie tatsächlich eine Liste zu durchlaufen haben :) –

+3

was ist das Problem, kompiliert es nicht? stürzt es ab ?. Beschreibe die Situation ein wenig mehr, damit andere dir helfen können. – Reno

+2

Was lässt Sie glauben, dass es nicht iteriert? –

Antwort

1

Sie beseitigen EnergyProbability zwischen Eingangsschleifen nicht. (* ns) [0] sieht daher die redundant gespeicherten Werte von der ersten Eingabe und ignoriert die neuen Werte, die tatsächlich in [2], dann [4] usw. sind. Fügen Sie einfach EnergyProbability.clear() hinzu, bevor Sie weitere Werte einlesen.

+0

Noch besser, Bereich die Variable richtig, so dass es jedes Mal automatisch durch die Schleife neu aufgebaut wird. Reinigen Sie zuerst den Code, bevor Sie sich über die Optimierung Gedanken machen. –

1

Sind Sie sicher, dass Sie das Array neutronSpectrum füllen, also ist es nicht leer? Bitte stellen Sie sicher, dass dies bis zum Ende durch Zugabe:

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

Vielleicht ein Problem mit der Eingabedatei gibt es (es ist leer oder nicht lesbar), so dass Sie nichts zu neutronSpectrum in erster Linie am Ende hinzufügen. Nur um sicherzustellen, fügen Sie bitte einige cout Anweisungen zu Ihrer while Schleife hinzu. Es lohnt sich auch für fin.error() nach dem while Schleife Überprüfung:

if (fin.error()) 
    cerr << "error: error reading input file: " filename << endl; 
+0

Wenn die Liste leer wäre, wäre list.begin() und list.end() nicht gleich? Dann würde das for auf null Iterationen verlassen. Auf eine Liste überprüft, die nicht früher gefüllt wird, wird ausgefüllt, nur auf das erste Element wird verwiesen. – morb

0

Wenn nichts am Ende in der for -loop gedruckt wird neutronSpectrum wahrscheinlich leer.

0

Ok, habe alle oben genannten Punkte überprüft, ein Problem war, dass ich den EnergyProbability - Vektor nicht jede Iteration der while - Schleife löschte (nicht, dass sie leer war), dies erzeugte einen immer größeren Vektor, der an die Jedes Mal, wenn man die Liste zurückführt, werden also die ersten beiden Elemente des Punkt-zu-Liste-Elements (A-Vektor) ausgegeben, und diese sind jedes Mal gleich (offensichtlich bin ich ein Narr). Also, jetzt weiß ich, das Problem ist in der Tat, dass der Iterator nicht erkennt, dass er das Ende der Liste erreicht hat, und wenn es tut, wirft es einen Nullzeiger, denke ich. hier Code:

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

Ausgabe lautet:

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 

dann Code :: Blocks müssen erkennen, dass es in einer Endlos-Schleife ist, wo nichts verändert und beendet den Code.

Prost Jungs

+0

oh, ignorieren Sie den Pop, der war, ob die Schleife nur einen Eintrag hatte, jetzt redundant und entfernt. – morb

+0

ok, also gebe ich die Adresse des Zeigers aus, nicht die angegebene Adresse, sorry people. – morb