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 :

tableau char [] et caratére 0 [Débutant(e)]


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut tableau char [] et caratére 0
    Bonjour ,

    sur un tableau de char [] , je n'arrive pas à affecter la valeur 0 sur un élément x du tableau .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    exemple :
     
    unsigned char * tab= new unsigned char [10] ;
     
    tab[4]= 0 ;
    le caractére 0 est compris comme le caractére fin du tableau comme '\0'
    j'utilise des valeur entre 0 et 255 . C pour un buffer sur un port Com .


    merci pour vôtre aide

  2. #2
    screetch
    Invité(e)
    Par défaut
    c'est parce que tu utilises des fonctions relatives aux chaînes de caractères sur des objets qui ne sont pas des chaînes de caractères.
    Si tu n'as pas une chaîne de caractère, oublie toute les methodes strXXXX, utilise les fonctions memcpy/memmove et autres.

  3. #3
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut
    je cherche à copier des valeurs integer ( 0 -> 255 ) dans ce tableau char .

    Si tu as un bout de code ?

    merci beaucoup pour ton aide

  4. #4
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 11
    Par défaut
    Citation Envoyé par parabole33 Voir le message
    sur un tableau de char [] , je n'arrive pas à affecter la valeur 0 sur un élément x du tableau
    C'est-à-dire ? L’affectation comme tu l’as fait est correcte.

    je cherche à copier des valeurs integer ( 0 -> 255 ) dans ce tableau char .
    Tu les veux à copier à partir de quoi ?

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par xirius Voir le message
    Tu les veux à copier à partir de quoi ?
    Et surtout, avec quelle fonction ?

    Comme indiqué plus haut, toutes les fonctions strxxx() ne doivent pas être utilisées.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    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
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::vector<unsigned char> tab(10);
    tab[4] = 42;
     
     
    // ....
    mon_port_com.SendBuffer(&tab[0],tab.size());
    Quand on s'affiche débutant, on évite les allocations dynamiques (ensuite on sait ne pas les utiliser).

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 614
    Par défaut
    Quand on s'affiche débutant, on évite les allocations dynamiques
    Je ne suis pas d'accord (mais ça n'engage que moi ). Quand on est débutant, vaut mieux se manger toutes les erreurs dans les dents et passer des heures à trouver ses segfault. Une fois qu'on a compris comment ça marche, on peut utiliser des trucs plus haut niveaux qui masquent tout ça, mais au moins on sais ce qu'il y a derrière.

    Sinon, pour revenir à parabole33, tu veux stocker 0 (la valeur 0) ou "0" (le caractère 0) ? Ce n'est pas la même chose, et c'est généralement perturbant pour les débutants.
    De même, char ne veut pas dire "caractère", mais juste "valeur entière stocké sur 1 octet".

  8. #8
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut
    Citation Envoyé par pyros Voir le message
    Je ne suis pas d'accord (mais ça n'engage que moi ). Quand on est débutant, vaut mieux se manger toutes les erreurs dans les dents et passer des heures à trouver ses segfault. Une fois qu'on a compris comment ça marche, on peut utiliser des trucs plus haut niveaux qui masquent tout ça, mais au moins on sais ce qu'il y a derrière.

    Sinon, pour revenir à parabole33, tu veux stocker 0 (la valeur 0) ou "0" (le caractère 0) ? Ce n'est pas la même chose, et c'est généralement perturbant pour les débutants.
    De même, char ne veut pas dire "caractère", mais juste "valeur entière stocké sur 1 octet".
    merci beaucoup pour ton aide !

    C en forgeant que l'on devient forgeron ....

    C la valeur int 0 et non le caractère "0" (48) que je souhaiterai passer dans un tableau . La fonction qui utilise ce buffer accepte que les char[] .

    G aussi la possibilité de passer le buffer en plusieurs fois . Et donc de passer un buffer vide (\0) pour obtenir un 0 . C pas cool à gérer ....

    Autrement avec le type unsigned byte (8 bits ) , est ce que cela serait le même pb ?

    Si vous avez besoin de faire un buffer en 8 bits , vous utiliseriez quoi comme type de donnée ?

    merci à tous .

  9. #9
    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 pyros Voir le message
    Je ne suis pas d'accord (mais ça n'engage que moi ). Quand on est débutant, vaut mieux se manger toutes les erreurs dans les dents et passer des heures à trouver ses segfault. Une fois qu'on a compris comment ça marche, on peut utiliser des trucs plus haut niveaux qui masquent tout ça, mais au moins on sais ce qu'il y a derrière.
    C'est vrai qu'avant d'apprendre à compter vaut mieux apprendre la théorie des nombre.

    Citation Envoyé par pyros Voir le message
    De même, char ne veut pas dire "caractère", mais juste "valeur entière stocké sur 1 octet".
    Ah bon
    Citation Envoyé par 3.9.1 Fundamental types
    Objects declared as characters (char) shall be large enough to store any member of the implementation’s basic character set.

  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 parabole33 Voir le message
    Autrement avec le type unsigned byte (8 bits ) , est ce que cela serait le même pb ?
    unsigned byte n'est pas un type C++. La norme ne dit à aucun moment qu'un char/unsigned char/signed char est sur 8 bits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::vector<unsigned char> tab(10);
    tab[4] = 42;
     
     
    // ....
    mon_port_com.SendBuffer(&tab[0],tab.size())
    Quelle est la fonction que tu appelles ? Peux-tu montrer ton code d'appel ? LE code d'envoi du buffer ?

  11. #11
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    unsigned byte n'est pas un type C++. La norme ne dit à aucun moment qu'un char/unsigned char/signed char est sur 8 bits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::vector<unsigned char> tab(10);
    tab[4] = 42;
     
     
    // ....
    mon_port_com.SendBuffer(&tab[0],tab.size())
    Quelle est la fonction que tu appelles ? Peux-tu montrer ton code d'appel ? LE code d'envoi du buffer ?
    la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    portcom.WriteCom(&buffer,strlen(buffer),&nBytesWritten) ;
     
    prototype: Bool com::WriteCom ( void* buffer , int nbyte  , int * nbytewritten) ;
     
    appel : WriteFile ( g_hCom , buffer, nbyte, (unsigned long * ) nbytewritten , NULL ) ;
    merci

  12. #12
    screetch
    Invité(e)
    Par défaut
    ton erreur vient (comme dit plus haut) de strlen qui travaille sur une chaîne de caracteres, pas sur un tableau d'octets
    et comme dit plus haut tu ne peux pas utiliser les fonctions strXXXX dans ce cas
    remplace strlen() par la taille du buffer que tu veux envoyer.
    La réponse de 3darchi est beaucoup plus simple et plus efficace.

  13. #13
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        std::vector<unsigned char> myBuffer(10);
        myBuffer[4] = 42;
     
        com portcom;
        int nBytesWritten;
        portcom.WriteCom(&myBuffer[0],myBuffer.size(),&nBytesWritten);
    Ceci dit, je pense que l'interface de com n'est pas au bon niveau

  14. #14
    Membre confirmé
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Juillet 2009
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Juillet 2009
    Messages : 114
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        std::vector<unsigned char> myBuffer(10);
        myBuffer[4] = 42;
     
        com portcom;
        int nBytesWritten;
        portcom.WriteCom(&myBuffer[0],myBuffer.size(),&nBytesWritten);
    Ceci dit, je pense que l'interface de com n'est pas au bon niveau
    j'avou que pour instant les vecteurs ne sont pas encore un reflex pour moi ! Mais c qu'une question de temps !!!

    merci à tous !

  15. #15
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 614
    Par défaut
    La norme ne dit à aucun moment qu'un char/unsigned char/signed char est sur 8 bits.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    std::vector<unsigned char> myBuffer(10);
    myBuffer[4] = 42;
     
    com portcom;
    int nBytesWritten;
    portcom.WriteCom(&myBuffer[0],myBuffer.size(),&nBytesWritten);
    <relou>
    Ca marche quand même si sizeof(unsigned char) != 1 ?
    </relou>

    Plus sérieusement, juste pour savoir, existe-t-il un type en C++ qui soit assuré de faire 1 octet ?

  16. #16
    screetch
    Invité(e)
    Par défaut
    sizeof(char) est toujours égal a 1.
    mais 1 on ne dit pas quoi. c'est partout 1 octet mais ca ca ne fait pas partie de la norme.
    dans ce cas de toutes facon c'est a l'implémentation (genre, le port com, le driver de la carte réseau...) de faire sa mixture pour être compatible avec le materiel.
    mais comme on ne peut pas faire plus petit qu'un char, c'est ce qu'on utilise pour envoyer des données

  17. #17
    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
    sizeof(char)==sizeof(unsigned char)==sizeof(signed char)==1 mais ce n'est pas 8 bits. En fait, il y a CHAR_BIT bits avec CHAR_BIT >=8

  18. #18
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mars 2011
    Messages
    614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 614
    Par défaut
    Ok, donc sizeof(char) = 1 byte (toujours), mais 1 byte vaut pas forcement 8 bits c'est ça ?

    C'est vrai que j'avais vaguement entendu parlé d'architectures ou 1 byte pouvait valoir 5 bits par ex, mais j'en ai jamais vue de mes yeux.

  19. #19
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    1 octet = 8 bits toujours, c'est la définition de l'octet.

    Le retour de sizeof est donnée en byte, qui est (marqué dans la norme et ca doit être la définition du byte), la taille de la plus petite séquence de mémoire que tu peux manipuler (c'est peut-etre pas très bien formulé mais l'idée est là).

    Et donc non Pyros, tu ne peux pas avoir de type qui fait avec certitude 1 octet, parce que si sur ta machine 1 byte = 9 bits, tu ne pourras pas avoir d'objet dont la taille est 8 bits.

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

Discussions similaires

  1. affichage de tableau char
    Par Phlogos dans le forum Débuter
    Réponses: 5
    Dernier message: 24/06/2010, 07h08
  2. Conversion d'un tableau int en tableau char
    Par lcoulon dans le forum Débuter
    Réponses: 7
    Dernier message: 11/12/2009, 11h53
  3. [C# - Débutant] comment créer tableau char *
    Par moulefrite dans le forum Windows Forms
    Réponses: 3
    Dernier message: 26/12/2008, 14h41
  4. question de tableau char (RandomAccessFile)
    Par beegees dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 15/05/2007, 15h37
  5. Limitation, declaration d'un tableau Char[]
    Par semby dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 16/06/2006, 19h01

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