2009-04-21 9 views
0

に反復しない::マップは、従来のMFCアプリケーションでthusly宣言:のstd ::マップのイテレータは、私はSTDを持っているMFCアプリ

typedef std::map<long, CNutrientInfo> NUTRIENT_INFO_MAP; 
typedef NUTRIENT_INFO_MAP::const_iterator NUTRIENT_INFO_ITER; 
typedef NUTRIENT_INFO_MAP::value_type NUTRIENT_INFO_PAIR; 
static NUTRIENT_INFO_MAP m_NutrientInfoMap; 

m_NutrientInfoMapは時にアプリのロードテーブルをループして作成することによって移入されますCNutrientInfoのインスタンスと、その後のstdに挿入:などのマップ:

m_NutrientMapInfo.insert(NUTRIENT_INFO_PAIR(nutrient.GetId(), nutrient)); 

のstdは::マップは現在のデータベースで定義されている栄養素のリストが含まれています。ある時点で、ユーザーはこの栄養素を新しい栄養素に加えることができ、ユーザーが追加しているものが既にリストに存在するかどうかを確認する。それは次のようなチェックを行います:

NUTRIENT_INFO_ITER iter = m_NutrientInfoMap.begin(); 
while (iter != m_NutrientInfoMap.end()) 
{ 
    m = (*iter).second; 
    if (_stricmp(m.GetFullName().c_str(), name.c_str()) == 0) 
    { 
     return m; 
    } 
    iter++; 
} 

または少なくともそうなっています。関数が実際に呼び出されると、whileループの最初の行を越えて進まない。ブレークポイントを設定すると、問題の行が何度も繰り返し呼び出され、それを越えて進まず、アプリケーションが停止します。実際の比較に入ると、それは正しく比較され、whileループラインに戻ります。ループの本体に進入するために再びステップインすると、whileループラインに戻ります。この同じロジックは、アプリケーションのどこかで問題なく使用されるので、この場合は何が起こっているのか分かりません。私はfor-loopを使って上記のロジックを書き直しました。うまく動くので、私はそれを回避することができませんが、C++は私の最強の言語ではありません。これは、サポートをお手伝いしている私は、これが将来の参照のために何をしているのか、実際に学び理解したいと思っています。加えて、ロジックは他の場所で動作し、ここには存在しないため、おそらく実際に対処する必要がある根本的な原因があります。

これに関するご意見やご感想をお待ちしております。

ありがとうございます。

+0

リリースモードでデバッグしていますか? –

答えて

3

例は実際にソースから貼り付けられていますか?おそらくそれはより多くのように見える:

while (iter != m_NutrientInfoMap.end()); // <== note the semi-colon 
{ 
    m = (*iter).second; 
    if (_stricmp(m.GetFullName().c_str(), name.c_str()) == 0) 
    { 
     return m; 
    } 
    iter++; 
} 
+0

私はあなたが正しいかもしれないと思った。しかし、@Scottが何を言っているか再び確認すると、彼は強制的に実際の比較をしてループに戻りました。私はちょうどセミコロンが問題であるかどうか疑問に思います。 –

+0

@aJ - 'while'制御式の直後にセミコロンがあった場合、それが(望ましくない場合は)予期される動作ではないでしょうか? –

+0

完全に合意しました。セミコロンがある場合は、間違いなくアプリケーションがハングします。私はただ彼の文章について疑問を抱いていました。彼は、ループに強制的に足を踏み入れることがループに戻っていると言います。 –

0

この動作の原因となる上記のコードには何もありません。ループ内の他のイテレータをインクリメントしているか、同じスコープを持つ同じ名前の2つのイテレータ(ループ内に1つ)があり、間違ったイテレータをインクリメントしている可能性がありますか?これが当てはまらない場合は、m_NutrientInfoMap.end()の値をメモし、++ iterがその値に評価されていない理由を確認するだけです。

関連する問題