2012-04-18 20 views
3

私はオブジェクトの内部にフィールドとしてペアのベクトルを持っています。このオブジェクトには、ベクトルのペアの値にアクセスする必要があるメソッドがあります。私はアクセスしたいベクトル内の場所を指すイテレータを使用しています。私はこれを実行しかしペアのベクトルで値にアクセスする際に問題が発生する

double x = headingTo->first - positionX; 
double y = headingTo->second - positionY; 

を:ヘッダファイルで

vector<pair<double, double> > points; 
vector<pair<double, double> >::iterator headingTo; 

コンストラクタで:

points.push_back(make_pair(1700.00, 3300.00));//Plus 20 or so other values 
headingTo = points.begin(); 

方法で、ここでベクトルを含むコードの断片でありますコードyは作成されていません。変数を見るためにブレークポイントを使用するとVisual Studioには表示されません。しかし、もし私が行を交換すると、yはアクセス可能であり、xはそうではありません。何か案は?

編集: 私は、次の作品を見つけた:

double headingToX = headingTo->first; 
headingToX -= positionX; 
double headingToY = headingTo->second; 
headingToY-= positionY; 
+0

コードはg ++でうまく動作します。 「yは作成されていません」と言ったら、どういう意味ですか?後で 'y'を参照すると、コンパイラはそのような変数が定義されていないと不満を持ちますか? – Beta

+1

コードが正しいように見えるので、おそらくデバッガの問題です。そのため、デバッガは2番目のペア要素を解決できません。 coutで値を印刷するとどうなりますか?そして、2行目以降のデバッガを停止しますか? – bjhend

+0

2行目の後にデバッガを停止します。 x VS上にマウスを置くと値がわかりますが、yの上にマウスを置くと何も起こりません。 VSはまた、私にすべてのローカル変数のリストを示し、yを表示せずにxを表示します。 yがxの前に初期化されると、逆の場合もあります。 – Connel

答えて

2

それは、最適化に関連します。あなたが割り当てた変数を使用していないので、コンパイラはそれらを作成しないことを選択しました(この場合はその1つです)。あなたがそれらを使用した分(それぞれの値を減算した実際の例では)、コンパイラはもうそれらを最適化できませんでした。

私はこの動作を他のコンパイラで見てきましたが、消えていく変数をダミーに使うことで、常にこの問題を解決しました。

+0

私は後で両方の値を使用します.xとyをスワップし、yが利用可能であり、xがそうでないと言うようにします。 – Connel

3

プログラムの最適化されたビルドをデバッグしていないことを確認します。この場合、プログラムの必要な出力を生成する必要がないと判断できる場合は、コンパイラは変数を削除できます。

ただし、最適化されていないビルドを使用していても、本当に変数を使用しないと、thieの動作が発生する可能性があります。 this bug report on the Express version of VC++ 2010では、あなたは(強調追加)マイクロソフトの代表者によって行われた次のコメントが表示されます:

はあなたが値を割り当てる以外 の方法で使用されていない変数にoccuringこの問題ですか? .pdbの変数が16進エディタで検査されているか、または解体の対応する "mov" 命令を参照しても、コンパイラ は、デバッガが 変数を検査します(コンパイラは常にデバッグビルドでも小さな最適化 を実行します)。デバッガは、 変数へのアクセスが、変数が値を割り当てられる以外の目的のために アプリケーションで使用される場合、コンパイラによって提供されることを保証するだけです。あなたは( が値を割り当てられている以外の)変数が使用されているREPROを持っていて、デバッガでそれを調べることができない場合

は 私たちに知らせてください。さもなければ、これはコンパイラの最適化の成果物です。

yの値を後で使用するかどうかは、投稿したコードからわかりません。

+0

私は後で両方の値を使用します。つまり、xとyをスワップし、yが利用可能であり、xがそうでないと言うようにします。 – Connel

+0

@Connel - デバッガのバグを犯しているようです。あなたがVS 11 Betaでコードを試してもまだそれが起こっているなら、MSにそれを修正させることができるかもしれません。好奇心から - 何のバージョンのVSを使用しているのですか(何らかの理由で私は2010年がその質問に言及されたと思っていましたが、今は "Visual Studio"を見ています)。プロジェクトの規模はどれくらいですか?それはどこかに掲示できるものなのでしょうか? –

関連する問題