OVH Cloud OVH Cloud

Comment détecter une erreur de CMap

6 réponses
Avatar
Jmr
Bonjour, je voudrais utiliser la classe template CMap des MFC, cependant, je
n'ais pas trouvé, dans la documentation fournie avec Visual C++ 6.0, les
moyens que je pourrais employer pour vérifier le bon déroulement des
fonctions membres de cette classe.
Par exemple, comment savoir si la fonction membre SetAt n'a pas subit un
échec d'allocation en mémoire ? En essayant d'intercepter une
CMemoryException ? Mais cela n'est pas précisé dans la doc alors .
Si quelqu'un peut me renseigner, Merci.

6 réponses

Avatar
Alexandre
"Jmr" a écrit dans le message de
news:blmumk$phr$
Bonjour, je voudrais utiliser la classe template CMap des MFC, cependant,


je
n'ais pas trouvé, dans la documentation fournie avec Visual C++ 6.0, les
moyens que je pourrais employer pour vérifier le bon déroulement des
fonctions membres de cette classe.
Par exemple, comment savoir si la fonction membre SetAt n'a pas subit un
échec d'allocation en mémoire ? En essayant d'intercepter une
CMemoryException ? Mais cela n'est pas précisé dans la doc alors .
Si quelqu'un peut me renseigner, Merci.



bonjour,
je connais pas la CMap des MFC... Serait-elle du même genre que la map de la
STL ? Si c'est le cas, je te conseille d'utiliser la map standard.
Avatar
Jmr
Je ne connais pas STL, mais en consultant le code source de la classe CMap,
il semblerait que celui-ci ne fasse appel qu'aux « fonction » «
AfxIsValidAddress » et ASSERT. Par suite, la détection d'un défaut d'
allocation mémoire ne conduirait alors qu'à l'affichage d'un message suivit
de l'abandon du programme. D'où la question, comment peut faire l'
utilisateur de la classe CMap pour éviter cela ?

"Alexandre" a écrit dans le message de
news:3f7ffc26$0$10425$

"Jmr" a écrit dans le message de
news:blmumk$phr$
> Bonjour, je voudrais utiliser la classe template CMap des MFC,


cependant,
je
> n'ais pas trouvé, dans la documentation fournie avec Visual C++ 6.0,


les
> moyens que je pourrais employer pour vérifier le bon déroulement des
> fonctions membres de cette classe.
> Par exemple, comment savoir si la fonction membre SetAt n'a pas subit un
> échec d'allocation en mémoire ? En essayant d'intercepter une
> CMemoryException ? Mais cela n'est pas précisé dans la doc alors .
> Si quelqu'un peut me renseigner, Merci.
>
bonjour,
je connais pas la CMap des MFC... Serait-elle du même genre que la map de


la
STL ? Si c'est le cas, je te conseille d'utiliser la map standard.




Avatar
Alexandre
"Jmr" a écrit dans le message de
news:blpogp$5h8$
Je ne connais pas STL, mais en consultant le code source de la classe


CMap,
il semblerait que celui-ci ne fasse appel qu'aux « fonction » «
AfxIsValidAddress » et ASSERT. Par suite, la détection d'un défaut d'
allocation mémoire ne conduirait alors qu'à l'affichage d'un message


suivit
de l'abandon du programme. D'où la question, comment peut faire l'
utilisateur de la classe CMap pour éviter cela ?




Qu'est-ce qu'est censée faire cette classe CMap ? Un conteneur associatif
(comme std::map) ou rien à voir ?
Avatar
Jmr
Cmap est un patron de classe qui fournie les comportements nécessaires à la
gestion d'un « dictionnaire » qui serait une sorte de liste « chaînée » dont
les éléments sont identifiés par une clef. Les fonctions membres de la
classe CMap utilisant un algorithme évolué pour accéder à l'élément
identifié par la clef.
Peut-être est-il nécessaire d'adapter le code de la classe à sa convenance ?

"Alexandre" a écrit dans le message de
news:3f8302e9$0$13284$

"Jmr" a écrit dans le message de
news:blpogp$5h8$
> Je ne connais pas STL, mais en consultant le code source de la classe
CMap,
> il semblerait que celui-ci ne fasse appel qu'aux « fonction » «
> AfxIsValidAddress » et ASSERT. Par suite, la détection d'un défaut d'
> allocation mémoire ne conduirait alors qu'à l'affichage d'un message
suivit
> de l'abandon du programme. D'où la question, comment peut faire l'
> utilisateur de la classe CMap pour éviter cela ?
>

Qu'est-ce qu'est censée faire cette classe CMap ? Un conteneur associatif
(comme std::map) ou rien à voir ?




Avatar
Alexandre
"Jmr" a écrit dans le message de
news:bm1fsr$jp7$
Cmap est un patron de classe qui fournie les comportements nécessaires à


la
gestion d'un « dictionnaire » qui serait une sorte de liste « chaînée »


dont
les éléments sont identifiés par une clef. Les fonctions membres de la
classe CMap utilisant un algorithme évolué pour accéder à l'élément
identifié par la clef.
Peut-être est-il nécessaire d'adapter le code de la classe à sa convenance


?




Bonjour,
alors dans ce cas la classe standard std::map fonctionne pareil. Je te
conseille de l'utiliser car elle existe sur tout compilo C++. (contrairement
à CMap qui est une classe des MFC donc limitée à Visual C++)

Pour reprendre ta question originale, la classe std::map déclenche des
exceptions en cas d'erreur, qui peuvent être de plusieurs type :
- bad_alloc pour les problèmes d'allocation par new
- out_of_range en cas d'accès impossible avec des opérateurs type at()
ou []
- etc...
En tout cas, toutes ces exceptions dérivent d' exception, qui est la classe
standard des exceptions en C++ (déclenchées par le langage ou la STL, donc
map).

Pour utiliser map, il faut inclure <map> (logique, non ?)

L'utilisation est très intuitive et simple.

#include <map>
#include <string>
#include <iostream>

typedef std::string TEL[10]; // numéro de téléphone
typedef std::map<std::string, TEL> REPERTOIRE;

void main()
{
REPERTOIRE Repertoire;

try {
Repertoire["Marcel"]= "0120457480";
//.....
std::cout<<"Le numéro de marcel est :"<<Repertoire["Marcel"];
//....
REPERTOIRE::iterator It; // itérateur sur une paire
for( It = Repertoire.begin(); It != Repertoire.end(); ++It)
cout<<"nLe numéro de "<<It->first<<" est "<<It->second;

//----
}
catch(std::exception& e)
{
std::cerr<<"nErreur dans l'utilisation de map";
}
}

bon, c'est un code rapide pour montrer std::map. bien sûr, tu peux éviter
les std:: en employant "using namespace std"

Pour + de détails voir l'aide en ligne de la STL.

Bonne chance.
A+
Avatar
Jmr
Merci

"Alexandre" a écrit dans le message de
news:3f847815$0$2806$

"Jmr" a écrit dans le message de
news:bm1fsr$jp7$
> Cmap est un patron de classe qui fournie les comportements nécessaires à
la
> gestion d'un « dictionnaire » qui serait une sorte de liste « chaînée »
dont
> les éléments sont identifiés par une clef. Les fonctions membres de la
> classe CMap utilisant un algorithme évolué pour accéder à l'élément
> identifié par la clef.
> Peut-être est-il nécessaire d'adapter le code de la classe à sa


convenance
?
>

Bonjour,
alors dans ce cas la classe standard std::map fonctionne pareil. Je te
conseille de l'utiliser car elle existe sur tout compilo C++.


(contrairement
à CMap qui est une classe des MFC donc limitée à Visual C++)

Pour reprendre ta question originale, la classe std::map déclenche des
exceptions en cas d'erreur, qui peuvent être de plusieurs type :
- bad_alloc pour les problèmes d'allocation par new
- out_of_range en cas d'accès impossible avec des opérateurs type at()
ou []
- etc...
En tout cas, toutes ces exceptions dérivent d' exception, qui est la


classe
standard des exceptions en C++ (déclenchées par le langage ou la STL, donc
map).

Pour utiliser map, il faut inclure <map> (logique, non ?)

L'utilisation est très intuitive et simple.

#include <map>
#include <string>
#include <iostream>

typedef std::string TEL[10]; // numéro de téléphone
typedef std::map<std::string, TEL> REPERTOIRE;

void main()
{
REPERTOIRE Repertoire;

try {
Repertoire["Marcel"]= "0120457480";
//.....
std::cout<<"Le numéro de marcel est :"<<Repertoire["Marcel"];
//....
REPERTOIRE::iterator It; // itérateur sur une paire
for( It = Repertoire.begin(); It != Repertoire.end(); ++It)
cout<<"nLe numéro de "<<It->first<<" est "<<It->second;

//----
}
catch(std::exception& e)
{
std::cerr<<"nErreur dans l'utilisation de map";
}
}

bon, c'est un code rapide pour montrer std::map. bien sûr, tu peux éviter
les std:: en employant "using namespace std"

Pour + de détails voir l'aide en ligne de la STL.

Bonne chance.
A+