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

C++ Discussion :

Perte de donn�es � la sortie d'une DLL


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Inscrit en
    F�vrier 2006
    Messages
    283
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2006
    Messages : 283
    Par d�faut Perte de donn�es � la sortie d'une DLL
    Bonjour,

    Voici un probl�me que je n'arrive pas � fixer qui va sans aucun doute �tre �vident pour vous :

    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
    22
    23
    24
    25
    26
     
    extern "C" DLL1 const  wchar_t * ZLA(const char   * pNUMBER)  // (par exemple 123456)
     
    char   RESULT[30];
     RESULT[0]='A';
     RESULT[1]='B';
     RESULT[2]='C';
     
    ///////////////////////////////
    // Le problème est ici
    RESULT[3] = pNUMBER [0]; 
    RESULT[4] = pNUMBER [1];
    RESULT[5] = pNUMBER [2];
    RESULT[6] = pNUMBER [3];
    RESULT[7] = pNUMBER [4];
    RESULT[8] = pNUMBER [5];
    //////////////////////////////
    RESULT[9] = 'Y';
    RESULT[10] ='Z';
     
    const char *pS =  RESULT;
    size_t size2 = sizeof(RESULT) + 1;
    wchar_t* wcRESULT = new wchar_t[size2];
     
    size_t outSize;
    mbstowcs_s(&outSize, wcRESULT, size2, pS, size2 - 1);
    En debug, je vois ABC123456YZ << c'est ce que j'attends.

    Mais lorsque ma valeur arrive dans mon application tierce, je n'ai plus que ABC1

    Si je place des valeurs en dur

    RESULT[3] = '1';
    RESULT[4] = '2';
    RESULT[5] = '3'
    RESULT[6] = '4'
    RESULT[7] = '5'
    RESULT[8] = '6';

    J'ai bien : ABC123456YZ � l'ext�rieur. J'ai �galement test� d'autres m�thodes pour r�cup�rer les valeurs en pensant qu'il y a peut �tre destruction des donn�es et donc perte des valeurs si la donn�e �tait pass�e en r�f�rence et non en valeur.

    Merci par avance !

  2. #2
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,
    V�rifie bien la valeur (hexad�cimale, pour �tre sur) des caract�res transmis en tant que pNumber. Tout particuli�rement celle de pNumber[0]...

    Ne serait-ce pas -- � tout hasard -- 0x00 (autrement dit '\0', le caract�re nul) au lieu d'�tre 0x30 (autrement dit le caract�re repr�sentant le chiffre '0') des fois

    Il faut en effet te dire que '0' ne vaut pas 0 dans la table ASCII (mais 48), et que le caract�re qui vaut 0 est un caract�re non affichable appel� "nul".

    Or, il se fait que ce caract�re nul (non affichable, de valeur 0 dans la table ASCII) est syst�matiquement utilis� comme caract�re repr�sentant la "fin d'une cha�ne de caract�res". Et tous les caract�res qui peuvent �tre pr�sents (ou non) apr�s un caract�re nul dans une cha�ne de caract�res sont syst�matiquement ignor�s et consid�r�s comme des "d�ch�ts" (d'une utilisation de la m�moire dans laquelle la chaine de caract�res �tait plus longue, peut �tre).

    C'est donc par abus de langage que l'on parle de "cha�ne" ou m�me de "cha�ne de caract�res", car on devrait en r�alit� parler de null terminated character string (cha�ne de caract�res termin�es par un 0) .

    Note au passage que tu auras un probl�me similaire (mais avec des parfois bien plus surprenants que la fin anticip�e de ta cha�ne de caract�res ) avec toutes les valeurs comprises entre (en hexad�cimal) 0x00 et 0x20 (exclu).

    Pour r�ellement obtenir l'affichage de chiffres, tu dois donc veiller � ce que les valeurs fournies � pNumber soient comprises dans l�intervalle [48 , 58[ (d�cimale) (la valeur 48 fournissant le '0' et la valeur 57 fournissant le '9' ... [0x30, 0x3A[ en hexad�cimal).

    Si les valeurs fournie par pNumber sont �gale � 0 ... 9 (inclus), pour �tre sur que cela permette la repr�sentation de chiffre, il faudra leur ajouter syst�matiquement 48
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  3. #3
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement mat�riel �lectronique
    Inscrit en
    D�cembre 2015
    Messages
    1 599
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 62
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement mat�riel �lectronique
    Secteur : High Tech - �lectronique et micro-�lectronique

    Informations forums :
    Inscription : D�cembre 2015
    Messages : 1 599
    Par d�faut
    Bonjour,

    Il y a un probl�me ligne 22. Ce que tu veux c'est la longueur donc size2 devrait valoir 10+1, en utilisant sizeof(un_pointeur)+1 tu vas avoir 4+1 ou 8+1 ce qui ne correspond � rien.

  4. #4
    R�dacteur/Mod�rateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 38
    Localisation : Canada

    Informations professionnelles :
    Activit� : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par d�faut
    RESULT est un array et non un pointeur (char RESULT[30];) donc le sizeof retournera ici 30.
    Cela dit, l'utilisation plus correcte de mbstowcs se fait normalement en 2 fois : un premier appel pour savoir la taille n�cessaire pour effectuer la conversion, puis l'appel pour r�aliser la conversion.
    Pensez � consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation r�seau ?
    Aucune aide via MP ne sera dispens�e. Merci d'utiliser les forums pr�vus � cet effet.

  5. #5
    Membre �clair�
    Inscrit en
    F�vrier 2006
    Messages
    283
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2006
    Messages : 283
    Par d�faut
    Bonjour et merci pour vos r�ponses.

    koala01 : j'ai bien la bonne valeur ASCII. j'avais v�rifi�. En point d'arr�t on voit bien que le type est 'char' avec une valeur ASCII.

    dalfab : je retourne bien les 30 caract�res.

    En fait si je code en dur les caract�res, je retourne toute la cha�ne.
    J'ai un exe en c++ qui teste et qui affiche bien la totalit� (codage en dur ou non).

    Une fois que j'utilise le pointeur, c'est comme si j'avais un \0 dans le tableau de char. Je ne retourne que le 1er des 6 caract�res.
    J'ai m�me utilis� 'vector', c'est la m�me chose.

  6. #6
    Membre �clair�
    Inscrit en
    F�vrier 2006
    Messages
    283
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2006
    Messages : 283
    Par d�faut
    Re

    Je viens de trouver. Le codage de (const char*) semble �tre fait sur 2 octets.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    	RESULT[8] = *(pNUMERO);
    	RESULT[9] =  *(pNUMERO+2);
    	RESULT[10] = *(pNUMERO + 4);
    	RESULT[11] = *(pNUMERO + 6);
    	RESULT[12] = *(pNUMERO + 8);
    	RESULT[13] = *(pNUMERO + 10);
    Pourquoi cela fonctionne en debug en faisant simplement +1... je ne sais pas.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 3
    Dernier message: 10/11/2011, 18h18
  2. Perte de donn�es en sortie de fonction
    Par sythpen dans le forum C++
    R�ponses: 26
    Dernier message: 16/03/2011, 14h22
  3. R�ponses: 23
    Dernier message: 17/10/2008, 10h28
  4. R�ponses: 0
    Dernier message: 22/10/2007, 11h46
  5. Format de donn�es en sortie d'une proc�dure stock�e
    Par Martin Sylvie dans le forum MS SQL Server
    R�ponses: 2
    Dernier message: 22/02/2005, 12h02

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