Проблемы с итератором продолжаются - PullRequest
0 голосов
/ 04 декабря 2010

Теперь я проверил этот код на предмет ошибок и убедился, что вывожу «правильные» вещи, чтобы обозначить проблему.Итератор никогда не указывает на список вообще, а на другую группу адресов, которые к счастью содержат правильные данные.

У меня есть два вопроса:

1 = учитывая форму кроватей, выводу ли я правильные элементы, чтобы выяснить, почему этот цикл не завершается;

2 = если(1) затем, что происходит для создания этого вывода, и есть ли у вас какие-либо советы, чтобы расширить мои знания указателя (я использовал это для формата цикла много раз раньше, и это никогда не происходило;

/ questions

код:

#include "neutronFileReader.h"

using namespace std ;

neutronFileReader::neutronFileReader()
{
}

list<vector<float> > neutronFileReader::spectrum(char* filename)
{
ofstream addresses ;
addresses.open("adresses.txt") ;
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
    getline(fin, binhi, ' ') ;      //get the binhi string

    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

    EnergyProbability.push_back(atof(binlo.c_str())) ; //store emnission probability
    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) ;
     addresses << &neutronSpectrum.begin() << " : " << &(*nS) << " : " << &neutronSpectrum.end() << endl ;    // print energy & prob to screen
     cout << &neutronSpectrum.begin() << " : " << &(*nS) << " : " << &neutronSpectrum.end() << endl ;
 }

 return neutronSpectrum ;
 }

и вот вывод:

0x28fbc4 : 0x510c38 : 0x28fbc0
0x28fbc4 : 0x510c58 : 0x28fbc0
0x28fbc4 : 0x510c78 : 0x28fbc0
0x28fbc4 : 0x510c98 : 0x28fbc0
0x28fbc4 : 0x510cb8 : 0x28fbc0
0x28fbc4 : 0x510cd8 : 0x28fbc0
0x28fbc4 : 0x510cf8 : 0x28fbc0
0x28fbc4 : 0x510d18 : 0x28fbc0
0x28fbc4 : 0x510d38 : 0x28fbc0
0x28fbc4 : 0x510d58 : 0x28fbc0
0x28fbc4 : 0x510d78 : 0x28fbc0
0x28fbc4 : 0x510d98 : 0x28fbc0
0x28fbc4 : 0x510db8 : 0x28fbc0
0x28fbc4 : 0x510dd8 : 0x28fbc0
0x28fbc4 : 0x510df8 : 0x28fbc0
0x28fbc4 : 0x510e18 : 0x28fbc0
0x28fbc4 : 0x510e38 : 0x28fbc0
0x28fbc4 : 0x510e58 : 0x28fbc0
0x28fbc4 : 0x510e78 : 0x28fbc0
0x28fbc4 : 0x510e98 : 0x28fbc0
0x28fbc4 : 0x510eb8 : 0x28fbc0

большое спасибо.

Ответы [ 3 ]

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

Исправьте меня, если я ошибаюсь, но разве 1-й и 3-й столбцы не представляют указатели на экземпляры итератора, возвращаемые begin () и end (), а не сами указатели на объекты (списка)?

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

Хорошо, похоже, все работает нормально (согласно последнему примеру).

Он достигает последнего элемента и затем останавливается (те, у которых время пока не достигает последнего элемента, поскольку они не выполняют условие последнего элемента).

Ключевым моментом здесь является то, что .end () и .back () указывают на разные вещи, поэтому следует ожидать разницы адресов.

.back () ссылается на последний элемент списка. .end () ссылается на элемент last-last-служит для остановки цикла ТОЛЬКО после обработки последнего элемента (в отличие от того, что происходит с:

while(&(*nS) != lastListElement) {
/*...*
}

, что приводит к остановке цикла ДО анализа последнего элемента.

Из того, что я мог собрать, ваша единственная проблема была с выводом адресов, верно? Или цикл не заканчивается там, где он должен быть?

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

Только что обнаружил это сам, но похоже, что итератор, возвращаемый list.end () , не указывает на допустимый элемент.Он указывает на элемент «конец конца».

Чтобы мы могли правильно понять, что происходит, вы должны вывести list.back () , который действительно указывает на последний элементсписок.Обратите внимание, что list.back () возвращает не итератор, а прямую ссылку на последний элемент (поэтому вы должны просто напечатать то, что возвращается без разыменования).

...