2009-04-21 6 views
0

J'ai un std :: carte a déclaré thusly dans une application MFC héritage:std :: carte iterator pas itérer dans MFC app

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 est renseigné lorsque la charge d'applications en boucle à travers une table et la création d'un instance de CNutrientInfo, puis l'insérer dans le std: carte comme:

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

le std :: carte contient maintenant une liste des nutriments qui ont été définis par la base de données. À un certain moment, un utilisateur peut ajouter un nouvel élément nutritif à cette liste et il vérifie si ce que l'utilisateur ajoute existe déjà dans la liste. Il fait cette vérification comme:

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

Ou du moins c'est censé. Lorsque la fonction est appelée, elle ne dépasse jamais la ligne initiale de la boucle while. Le fait d'y placer un point d'arrêt montre simplement que la ligne en question est appelée à plusieurs reprises et ne progresse jamais au-delà, ce qui bloque l'application. Si vous entrez dans la comparaison réelle, elle compare correctement, puis revient à la ligne de boucle while. Rentrez à nouveau pour avancer dans le corps de la boucle revient simplement à la ligne de boucle while. Cette même logique est utilisée ailleurs dans l'application sans problème, donc je suis perplexe quant à ce qui se passe dans ce cas. J'ai réécrit la logique ci-dessus en utilisant une boucle for et ça marche très bien, donc ce n'est pas comme si je ne pouvais pas contourner cela, mais C++ n'est pas mon langage le plus fort et comme c'est une application héritée En essayant d'aider, je voudrais vraiment apprendre et comprendre POURQUOI c'est ce que je fais pour l'avenir. De plus, puisque la logique fonctionne ailleurs et pas ici, il y a peut-être une cause sous-jacente qui est ce qui doit être traité.

Toutes les suggestions ou réflexions à ce sujet seraient grandement appréciées.

Merci d'avance.

+0

Déboggez-vous en mode édition? –

Répondre

3

Votre exemple est-il réellement collé à partir de la source? Peut-être qu'il ressemble plus à:

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

Je pensais que vous pourriez avoir raison. mais en vérifiant à nouveau ce que @Scott dit, il est entré de force dans la comparaison réelle et il est revenu à la boucle. Je me demande simplement si le point-virgule est le problème. –

+0

@aJ - ne serait-ce pas le comportement attendu (si non désiré) s'il y avait un point-virgule immédiatement après l'expression de contrôle 'while '? –

+0

Entièrement d'accord. S'il y a un point-virgule alors définitivement l'application va se bloquer. Je me demandais juste à propos de sa phrase, dans laquelle il dit, entrer de force dans la boucle revient à la boucle. –

0

Il n'y a rien dans le code affiché ci-dessus qui peut provoquer ce comportement. Etes-vous sûr que vous incrémentez un autre itérateur dans la boucle ou y a-t-il deux itérateurs avec le même nom (un dans la boucle) avec des étendues différentes et vous incrémentez le mauvais itérateur? Si ce n'est pas le cas, alors seulement une autre alternative que je pourrais voir est de noter la valeur de m_NutrientInfoMap.end() et vérifier pourquoi ++ iter n'évalue pas dans cette valeur.

Questions connexes