質問

私は、従来のMFCアプリケーションでthusly宣言のstd ::マップを持っています

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ループを使用して、上記のロジックを書き換えてきた、私がそれを回避することができないようではないですが、C ++が私の最強の言語ではありません、これは私が「レガシーアプリがあるように、それは、うまく動作しますサポートを支援しようとmが、私は本当に学び、これが、それは今後の参考のためにやっている何やっている理由を理解したいと思います。ロジックは、ここで他の場所ではなく動作しますので、プラス、おそらく実際に対処する必要があるものである根本的な原因があります。

この上の任意の提案や考えをいただければ幸いです。

事前に感謝します。

役に立ちましたか?

解決

あなたの例では、実際にソースから貼り付けていますか?多分それはより多くのようになります:

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

他のヒント

その行動を引き起こす可能性が上記の投稿のコードでは何もありません。あなたはループ内で他のいくつかの反復子をインクリメントしているかが異なるスコープと同じ名前(ループ内1)と2回の反復子とすることができ、あなたが間違ったイテレータを増加していることを確認していますか?そうでない場合は、私が見ることができる唯一の他の選択肢はm_NutrientInfoMap.end(の値を書き留め)とITERがその値に評価されていない理由++チェックすることです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top