IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

Erreur de type pour la fonction CStringArray::Add


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Par défaut Erreur de type pour la fonction CStringArray::Add
    Bonjour/soir,

    Une erreur me gene dans mon développement :
    Je n'arrive pas à éxécuter la fonction Add de la classe CStringArray.
    L'erreur retourner est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    First-chance exception in Test.exe: 0x80000002; Datatype Misaligment
    Le code ma fonction qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    CStringArray* CForm2::ReadLine(CString str) 
    {
    	CStringArray *saLine= new CStringArray;
    	wchar_t *szItem=NULL;
    	wchar_t *sz = new wchar_t[255];
    	wcscpy(sz,str); //conversion en pointeur
     
    	wchar_t *pWord = wcstok(sz, L";");
     
    	while( pWord != NULL )
    	{
    		//saLine->Add(pWord); // erreur
    		//saLine->Add("test"); // la aussi erreur
    		saLine->Add(L"test2"); // la encore :'(
    		// Get Next Token
    		pWord = wcstok( NULL, L";" );
    	}
    	TRACE(L"nb Item = %d", saLine->GetSize());
    	return saLine;
    }
    Comme vous le voyez j'ai tester plusieurs solution et aucune ne fonctionne...
    Pourtant ça compile, l'edition des liens aussi ...
    Mais à l'éxécution --> BAM ! Erreur.

    Avez vous une idée la dessus ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    a mon avis tu travailles avec des types unicode wchar et ton projet n'est pas en réglé en UNICODE .
    alors la CStringArray et la CString par défaut traite des chaines non unicode d'ou le plantage si je ne me trompe pas....

  3. #3
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    note : si ton projet est mixte avec visual 2005 tu peux utiliser des
    CStringW et tu peux aussi faire un CStringArray Unicode comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CArray<CStringW ,CStringW>  array;

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Par défaut
    En fait je travaille sous Embedded Visual C++ 4.0 pour système embarqué (PDA industriel).
    Je ne sais pas vraiment comment faire pour regler le projet en unicode, j'ai regardé au niveau de la configuration du compilateur mais je n'ai pas trouvé de notion de "Unicode" ou de "character set" ...

    J'en déduis donc qu'il existe une autre solution, après avoir regardé sur internet (vive Google) je suis tombé la dessus : http://www.codeppc.com/evc/articles/unicode.html

    J'en ai conclus que ce que j'utilisais etait correct ...
    et pourant ça ne fonctionne pas :'(

    Faut il que je change de type de chaine de caractère ? TCHAR ? autre ?

    Ps: Les CStringW n'existe pas en eVc apparament ... ça compile pas

    Ps2: J'ai essayer avec la macro TEXT() mais toujours la meme erreur lors de l'execution.

    Ps3: J'ai déplacer la ligne "saLine->Add(L"test2");" juste après la déclaration de "CStringArray* saLine = new CStringArray" --> fonctionne très bien !!
    Donc le problème vient de mon code au niveau du traitement des wchar_t et du while ... je continue a chercher une solution

    Ps4: Le problème vient de là : "wcscpy(sz,str);"
    En mettant toutes les lignes en commentaire et en les enlevant une à une. j'ai retrouvé mon erreur (datatype misalignment) au moment ou j'ai decommenté cette ligne ... mais quel est le problème ???

  5. #5
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    si tu es sous Embedded tu es de base en Unicode .
    donc les MFC sont réglées pour travailler dans ce mode.
    l'explication que je vois et que tu exploses la mémoire, peut être avec cette ligne :
    d'ailleurs si tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    StringArray* CForm2::ReadLine(CString str) 
    {
        CStringArray *saLine= new CStringArray;
    saLine->Add(L"test2");
        wchar_t *szItem=NULL;
        wchar_t *sz = new wchar_t[255];
    }
    ça fonctionne ?

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Par défaut
    Oui comme cela ça fonctionne (cf Ps3 dans mon post plus haut)

  7. #7
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    alors tu exploses la mémoire, puisque tu ne testes pas la longueur de la chaine source str pour faire une allocation mémoire en rapport pour la variable
    sz, que tu as réglé arbitrairement à 255 éléments...

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Par défaut
    J'ai pris ce bout de code dans un tutoriel, ou un forum ... je ne sais plus.
    Il fonctionne très bien dans d'autres cas dans le meme projet.

    Quelles modifications dois je effectuer s'il te plait ?

    J'ai changé le 255 par 2048 et tout fonctionne parfaitement !
    Je sais que ce n'est pas très propre par contre

    Comment puis je faire pour que ce soit du code propre (ou du moins plus propre que ça ?

  9. #9
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     wchar_t *sz = new wchar_t[str.GetLength()+1];

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Janvier 2005
    Messages : 76
    Par défaut
    Problèmes résolus
    Et merci encore pour toute ton aide !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. DependencyProperty erreur de type (pour régler le contraste d'un mediaElement) (VS2010 VB.NET)
    Par Thierry2008 dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 13/12/2014, 00h31
  2. Réponses: 0
    Dernier message: 10/12/2014, 20h35
  3. [AC-2010] Erreur de type pour une entrée dans une table
    Par touraine dans le forum VBA Access
    Réponses: 2
    Dernier message: 15/12/2012, 13h40
  4. Erreur de type dans ma fonction
    Par adriennoob dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/04/2010, 11h11
  5. Réponses: 1
    Dernier message: 12/12/2005, 03h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo