Visual Studio 6, stl, vector et unicode : arg

hibakusha Messages postés 25 Date d'inscription vendredi 4 août 2006 Statut Membre Dernière intervention 23 mai 2007 - 4 août 2006 à 17:04
hibakusha Messages postés 25 Date d'inscription vendredi 4 août 2006 Statut Membre Dernière intervention 23 mai 2007 - 4 août 2006 à 21:09
Bonjour à tous.

1er post, 1ere erreur ? c'est peut être pas ici que je doit pleurer... j'essaye

J'ais quelque chose de simple, une petite appli qui tourne bien sous CE 4.2, mais qui aujourd'hui cafouille sous windows "pas-CE" (XP par exemple).

A un moment donnée je vide un vecteur comme cela :  modules.erase(modules.begin(), modules.end());

Tout est OK si je compile "en ASCI" (c'est a dire pas en unicode), mais si je compile avec UNICODE de defini, et bien l'appli reste bloquer dans le erase. Et comme c'est un vecteur (la stl, template donc) je vois rien en pas a pas, je ne comprend pas pourquoi erase ne s'arrete jamais. Et y'a pas d'erreur, ca tourne sans que rien ne se produise....pas d'acces violation, rien, nada, walou.

Ce qui est stocké dans le vecteur est assez bete, une structure simple avec des DWORD et des trucs comme ça, pas de pointeurs ni rien de dangereux.

Quelqu'un a t'il une idée de ce que je devrais chercher ?

note : je travail avec Visual C++ 6.

Merci.

zNoRt~!

7 réponses

nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
4 août 2006 à 18:04
Tu a définit UNICODE et _UNICODE ou seulement UNICODE ? Si tu n'a pas définit _UNICODE, essaye de le définir pour voir si ça ne vient pas de là.

//Libère ma mémoire que j'ai utilisé
this->GetCurrentConversation()->FreeAllocatedMemory(REASON_UNUSED);
0
hibakusha Messages postés 25 Date d'inscription vendredi 4 août 2006 Statut Membre Dernière intervention 23 mai 2007 1
4 août 2006 à 20:12
    Les deux mon capitaine, je me suis déja fais avoir : MS s'amuse à changer ses #define d'une version de Visual à l'autre. _UNICODE  ou UNICODE, _DEBUG ou DEBUG etc....

Au final, je me contente très bien d'une version non unicode de l'appli, ça n'a aucune importance, nous n'avons pas d'imperatif d'internationalisation ou autre, mais j'aimerais bien comprendre ce qui ce passe bond'la.

Merci .

zNoRt~!
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
4 août 2006 à 20:17
En fait, ça ne vient pas de la version de VC++ ce UNICODE et _UNICODE : UNICODE est utilisé par l'API Win32, et _UNICODE par la librairie standard C.

Tu pourrais donner la structure qui est dans ton vector "modules" ?

En fait, tu pourrais remplacer ton erase par un resize tout con :
modules.resize(0); //Vidage du tableau

//Libère ma mémoire que j'ai utilisé
this->GetCurrentConversation()->FreeAllocatedMemory(REASON_UNUSED);
0
hibakusha Messages postés 25 Date d'inscription vendredi 4 août 2006 Statut Membre Dernière intervention 23 mai 2007 1
4 août 2006 à 20:38
La structure je l'ai pas en tête, et le boulot c'est terminer jusqu'au 1 septembre, vacances, aussi j'y retournerais pas pour toi

Mais en gros, elle doit ressembler à cela :
struct _module_information
{
   TCHAR path[MAX_PATH];
   TCHAR version[taille je sais plus combien]
   DWORD crc32;
   DWORD size;
} module_information;

Je te devance un peu, voici l'utilisation que j'en fait : je parcours recursivement un repertoire et ses fils pour  y chercher tous les exe/dll qui constituent notre appli. Des que j'en trouve je renseigne une variable local (mod) du type de la structure et je la colle dans le vecteur par un modules.push_back(mod);

Y'a donc une copie qui est effectuée, c'est sûr. Et je me demande si le problème au vidage du vecteur ne vient pas du fait du destructeur par defaut géneré par le compilo pour la structure (car apres tout en C++ une structure est une class un peu simpliste, sans fonction membres, y'a donc forcement constructeur/destructeur par defaut. Non ?)

Je note le coup du resize(0) pour la rentrée.

Thanks

zNoRt~!
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
hibakusha Messages postés 25 Date d'inscription vendredi 4 août 2006 Statut Membre Dernière intervention 23 mai 2007 1
4 août 2006 à 20:42
apparté : UNICODE vs. _UNICODE, y'a quand même à voir avec la version de Visual. Par exemple, entre Visual C++ 6 et Embedded C++ 4.0, et bien si tu veut coder un p'ti bidule que pour une phase de débug, faut l'encadrer par DEBUG dans une version de Visual et _DEBUG dans l'autre, idem pour UNICODE / _UNICODE, MBCS etc...

zNoRt~!
0
nightlord666 Messages postés 746 Date d'inscription vendredi 17 juin 2005 Statut Membre Dernière intervention 23 mai 2007 10
4 août 2006 à 20:46
J'ai essayé ce code :

#define UNICODE
#define _UNICODE

#include <tchar.h>
#include <vector>
#include <windows.h>

using namespace std;

struct module_information
{
    TCHAR path[MAX_PATH];
    TCHAR version[50];
    DWORD crc32;
    DWORD size;
};

int _tmain()
{
    vector<module_information> modules;
    module_information mod = {TEXT("TEST"), TEXT("TEST"), 0, 0};
    modules.push_back(mod);
    modules.erase(modules.begin(), modules.end());
    return 0;
}

Je compile, aucune erreur, j'execute, aucun problème...
Je me demande d'où ça peut venir...

//Libère ma mémoire que j'ai utilisé
this->GetCurrentConversation()->FreeAllocatedMemory(REASON_UNUSED);
0
hibakusha Messages postés 25 Date d'inscription vendredi 4 août 2006 Statut Membre Dernière intervention 23 mai 2007 1
4 août 2006 à 21:09
itou.... 0 Warning, 0 error, mais exécution = puik !

Dans mon cas, UNICODE et _UNICODE sont définit pour tout le projet (project settings -> onglet C/C++ -> catégorie preprocessor), mais ça revient au même., J4ai essayer en linkan avec differentes version de la librairie C (Debug multithreaded, Debug multithreaded DLL etc ) mais c'est toujours pareil.

Bah.... je vais aller manger, dormir,  preparerun peu les valises, aller en Bretagne, lire des livres en papier avec des mots dedans, nager, et je verais tout ça à la rentrée.

Merci du coup de main

zNoRt~!
0
Rejoignez-nous