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 152
    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 152
    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écupérer les données BMP à partir d'une DLL
    Par KRis dans le forum Langage
    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