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 :

Pourquoi ce code ne m'affiche pas la bonne valeur ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Par défaut Pourquoi ce code ne m'affiche pas la bonne valeur ?
    Pourquoi ce petit bout de code ne m'affiche pas la valeur attendue ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char * tab = new unsigned char['h','e','l','l','o','\0'];
    cout << *tab << endl;   //il m'affiche 'î' au lieu de 'h', pareil pour *(tab+1) il m'affiche 'à' au lieu de 'e'
    Comment je dois faire pour afficher les valeurs correctes de mon taleau de char ?
    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 51
    Par défaut
    Ne devrais-tu pas faire une boucle pour afficher chaque valeur de ton tableau ?

  3. #3
    Membre très actif

    Inscrit en
    Juillet 2008
    Messages
    186
    Détails du profil
    Informations forums :
    Inscription : Juillet 2008
    Messages : 186
    Par défaut
    tab est un poiteur sur la chaîne de caractères. C'est lui qu'ils faut injecter dans le flux. Pas besoin de le déréférencer.


  4. #4
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Salut,
    Essaye plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // Ce code suggère une compilation ANSI
    char *tab = new char[10];
    sprintf(tab, "hello");
    std::cout << tab << std::endl;
    Je ne crois pas que tu puisses utiliser des chaînes de caractères avec des unsigned char*, je crois que tu es obligé de les signer.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Spout Voir le message
    Je ne crois pas que tu puisses utiliser des chaînes de caractères avec des unsigned char*, je crois que tu es obligé de les signer.
    Sous visual et sous gcc/windows, std::cout<<unsigned char* fonctionne et ça ne me choque pas sinon cela voudrait dire une conversion implicite vers du short/int/long.

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    En c++ il est préfèrable d'utiliser les std::string

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    En c++ il est préfèrable d'utiliser les std::string
    Sur le principe, tout à fait d'accord. std::string est faite pour ça. Mais dans son exemple, le problème ne venait pas de là.

  8. #8
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Sous visual et sous gcc/windows, std::cout<<unsigned char* fonctionne et ça ne me choque pas sinon cela voudrait dire une conversion implicite vers du short/int/long.
    OK, mais je parlais de toutes les fonctions CRT pour les chaînes de caractères (sprintf, strlen, ...)

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Par défaut
    Merci pour vos réponses !

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Mr. X Voir le message
    Pourquoi ce petit bout de code ne m'affiche pas la valeur attendue ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char * tab = new unsigned char['h','e','l','l','o','\0'];
    Ca ne marche pas comme ça! Entre les crochets [] tu dois mettre la taille de ton tableau. Tu ne peux pas mettre des valeurs d'initialisation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       unsigned char tab[]="hello";
       std::cout<<tab<<std::endl;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       unsigned char * tab = new unsigned char[6];
       tab[0]='h';
       tab[1]='e';
       tab[2]='l';
       tab[3]='l';
       tab[4]='o';
       tab[5]='\0';
       std::cout << tab << std::endl;
    Citation Envoyé par Mr. X Voir le message
    cout << *tab << endl; //il m'affiche 'î' au lieu de 'h', pareil pour *(tab+1) il m'affiche 'à' au lieu de 'e'
    Normal, tu n'avais alloué qu'un buffer de taille 0. Et encore, tu as de la chance, car si ta zone mémoire n'avait pas contenu un 0, tu aurais pu aller jusqu'à une zone interdite et là !
    Citation Envoyé par Mr. X Voir le message
    Comment je dois faire pour afficher les valeurs correctes de mon taleau de char ?
    Merci
    Réviser les notions de tableau et de new[].

  11. #11
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Normal, tu n'avais alloué qu'un buffer de taille 0. Et encore, tu as de la chance, car si ta zone mémoire n'avait pas contenu un 0, tu aurais pu aller jusqu'à une zone interdite et là !
    un bon vieux crash est bien meilleur pour montrer que ca ne marche pas qu'un comportement qui "marche presque", et quand ca "marche presque" j'appelle jamais ca de la chance, plutot de la malchance. dans un monde parfait, des que tu ferais une erreur, tu meurs
    (a ne pas appliquer en politique)

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    C'est bien cela
    la virgule sert de Séquenceur dans les opération.
    donc on fait bien un new unsigned char['\0']; => new unsigned char[0];

    Bon la c'est moins drôle.
    Mais je l'ai eu dans un simulateur qu'il fallait corriger où un nombre était écrit avec une virgule et non un point
    http://www.developpez.net/forums/d71...float-virgule/

    J'adore ce bug. Tellement subtile qu'il passe inaperçu.

    [edit]
    par contre je ne sait plus si résultat de 'h','e','l','l','o','\0' est définie.L'ordre est respecté(il me semble) mais que le retour utilisé non...

Discussions similaires

  1. Requete qui n'affiche pas les bonnes valeurs
    Par snips67 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 29/01/2010, 10h54
  2. Pourquoi ce programme ne m'affiche pas le bonjour
    Par phenix1988 dans le forum C++
    Réponses: 6
    Dernier message: 29/01/2009, 17h15
  3. pourquoi mes coordonnées ne s'affichent pas à l'ecran?
    Par christianf dans le forum AWT/Swing
    Réponses: 10
    Dernier message: 21/09/2007, 10h45
  4. [Outils][Crystal Report] Pourquoi mes icones ne s'affichent pas ?
    Par tonynho dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 12/05/2006, 15h29

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