2010-12-04 2 views
0

私はこのコードをかなりよくチェックして、問題の概要を示す正しいものを出力していることを確認しました。イテレータはリストを一度も指すことはありませんが、うまくいけば正しいデータが含まれている別のアドレスの束です。イテレータの問題が続きます

私は2つの質問があります。

1 = coutsの形与えられたが、私はこのループは出ていない理由を調査するために、正しい項目を出力しています。

2 =(1)その後、何この出力を生成するために起こっているとあなたは私のポインタの知識を促進するために何かアドバイスはあります(私は前にループ形式のために何回もこれを使用しており、これが起こっていないように決してならば、

/質問

コード:

#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 

ありがとうございました。

答えて

0

これは正常に動作しているようです(最後の例によると)。

最後の要素に達してから停止します(最後の要素に条件が満たされないため、最後の要素に到達することはありません)。

ここで重要なのは、.end()と.back()は、アドレスの違いが予想されるように、異なるものを指していることです。

.back()は、リストの最後の要素を参照します。 .ENDは、()で起こることとは対照的に、最後の要素は、(処理された後にのみサイクルを停止するのに役立つ過去最後に要素を参照:分析する前周期停止をもたらす

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

最後の要素。

私はあなたの唯一の問題は、右のアドレスの出力とあったか、それともそれは偉大な情報であること?

+0

それはあなたの助けによるものではなく、実際には1つの投稿の後に正しく動作していました。 *恥ずかしがり屋。しかし、この前後でイテレータの理解が大幅に向上しましたので、非常に反抗してくれてありがとう、あなたの時間を無駄にしてしまいました。あなたもそれから何かを得ることを望む! – morb

+0

本当に!私がSTLコンテナ(地獄、私がC++を使いこなした最後の時間)を混乱させた最後の時間は、2年前だったので、リフレッシャーとして役立った。私は助けになることができてうれしい! – AlexJF

1

私が間違っていても正解ですが、第1列と第3列は、リストのオブジェクトへのポインタではなく、begin()とend()によって返されるイテレータインスタンスへのポインタを表していませんか?

+0

1あなたは全く正しいです –

+0

になっているところのサイクルが出ていない集めることができるものから、 、ありがとう!今すぐコードを変更するが、どのように置換するのですか:&(* neutronSpectrum.begin())は正しいですか? (実際のコードを同時に書くときには)難しい作業です:) – morb

+0

あなたの解決策は、&(* neutronSpectrum.begin())が正しいアプローチであると思います。iteratorが参照しているアイテムを返すと、&演算子を使ってメモリアドレスを取得します。反乱はそれも供給をしたものの、このAlthogh – AlexJF

0

ちょうど自分自身を発見しましたが、list.end()によって返されたイテレータは有効な要素を指していないようです。過去の要素を指しています。

何が起こっているのか正しく理解できるように、実際にはリストの最後の要素を指しているlist.back()を出力する必要があります。 list.back()はイテレータを返すのではなく、最後の項目への直接参照を返すことに注意してください。

+0

ねえ、そうです。私が以下を投稿するとすぐに、私は.back()メソッドを使い始めました。残念ながら、ループを終了するようイテレータに指示することはできません。 – morb

+0

うん、あなたは正しい。私が以下を投稿するとすぐに、私は.back()メソッドを使い始めました。残念ながら、ループを終了するようイテレータに指示することはできません。 C:\ Users \ morb \ Documents \ Programming \ C++ \ collimatedNeutrons \ neutronFileReader.cpp:35:エラー: 'nS!= lastListElement'の 'operator!='に一致しません。 (lastListElementをさまざまな試みに置き換えて)これを行う方法はありますか?今はイテレータを完全に削除し、通常のポインタを使ってリストを移動しようとしています。 - それはうまくいきませんでした – morb

+0

デバッグの目的で(cout用に).back()を提案しました。私は実際にforループのためにそれを使用することをお勧めしませんが、あなたが本当にそれを試してみたい場合、for(...;&(* nS)!= lastListElement; ...)。これは、lastListElementがリスト上の最後の要素へのポインタであると仮定した場合のものです。 – AlexJF

関連する問題