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 :

problème d'ajout de caractère à une chaine


Sujet :

C

  1. #1
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut problème d'ajout de caractère à une chaine
    Bonjour à tous,

    Je n'ai pas fini dans mes déboires de code
    il semble qu'après avoir encodé mes chiffres sur le keypad la chaine enteredcode ne se remplit pas.

    D'ailleurs est-ce que la syntaxe est elle juste ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enteredcode[10] += key;
    Comment faire pour ajouter des suites de caractères à une chaine ?
    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
    27
    28
    29
    int mastercode = 275012; 
     
      char enteredcode[10] = "";
      for (int i = 0; i < 6; i++){
        char key = kpd.waitForKey();
        if(key == '#'){     // # is used to cancel
        i = 6; //skip to the end
        lcd.print("Cancelled"); 
        }
        if(key != NO_KEY){  
          lcd.print(key);  
          enteredcode[10] += key;  
        }
      }
     char buffer[15];
      itoa(mastercode,buffer,10);
     
     int com = strcmp(enteredcode, buffer);
     if (com == 0)  
     
      {
        lcd.setCursor (0, 2);
        lcd.print("CODE CORRECT"); 
     
       }
    else {
    lcd.setCursor (0, 2);
        lcd.print("CODE INCORRECT"); 
    }
    Merci pour l'aide

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Tu ne peux pas manipuler tes chaînes de cette manière, ce n'est pas du C++. En C on utilise string.h.

    Revois immédiatement le chapitre sur la manipulation de chaînes en C, ou tu ne t'en sortiras pas.

  3. #3
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    J'ai effectué qques modifications et la variable "enteredcode" se remplit correctement avec "strcat".

    Cependant j'ai un "CODE INCORRECT" au résultat de comparaison et je ne vois pas pourquoi.

    Pourtant je compare bien 2 variables de type char[].

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
     int mastercode = 275012;
       char enteredcode[10] ="";
     
     
      for (int i = 0; i < 6; i++){
        char key = kpd.waitForKey();
        if(key == '#'){ 
        i = 6; 
        lcd.print("Cancelled"); 
        }
        if(key != NO_KEY){ 
          lcd.print(key); 
          char str[2];
          str[0]=key;
          str[1]='\0';
     
         strcat(enteredcode, str);
         }
      }//fin boucle for
     
     char buffer[15];
     itoa(mastercode,buffer,10);
     
     int com = strcmp(enteredcode, buffer);
     if (com == 0)  
     
      {
        lcd.setCursor (0, 2);
        lcd.print("CODE CORRECT"); 
     
       }
    else {
    lcd.setCursor (0, 2);
        lcd.print("CODE INCORRECT"); 
    }

  4. #4
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    J'essaye des pistes mais voici ce que je ne comprend pas.
    Si j'ajoute un affichage sur la console série via des variables buffer et enteredcode j'ai respectivement ces 2 valeurs qui s'affichent :

    12222 pour buffer
    275012 pour enteredcode

    Pourquoi ai-je déjà une différence entre ces 2 variables ?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Franchement, d'ici je ne vois pas où est l'erreur, ton code m'a l'air correct.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Je cherche toujours

    Cette variante avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char mastercode[10]= "275012";
    fonctionne correctement.

    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
    27
    28
    29
    30
    31
    32
    33
    char mastercode[10] = "275012";
       char enteredcode[10] ="";
     
     
      for (int i = 0; i < 6; i++){
        char key = kpd.waitForKey();
        if(key == '#'){ 
        i = 6; 
        lcd.print("Cancelled"); 
        }
        if(key != NO_KEY){ 
          lcd.print(key); 
          char str[2];
          str[0]=key;
          str[1]='\0';
     
         strcat(enteredcode, str);
         }
      }//fin boucle for
     
     
     int com = strcmp(enteredcode, mastercode);
     if (com == 0)  
     
      {
        lcd.setCursor (0, 2);
        lcd.print("CODE CORRECT"); 
     
       }
    else {
    lcd.setCursor (0, 2);
        lcd.print("CODE INCORRECT"); 
    }
    L'erreur viendrait donc de la conversion de mastercode int vers char.
    Sauf que je ne vois pas où.

  7. #7
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Voilà j'ai trouvé l'erreur mais je ne sais pas la solutionner.

    avec cela fonctionne correctement.

    au delà de 2 chiffres il me dit que c'est incorrect.

    Qu'en pensez vous ?

  8. #8
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    j'ai encore trouvé un indice.
    Je sais encoder sur 3 chiffres mais limité à la valeur de 255.
    Donc c'est la limitation de itoa() à 256 qui cause le problème.

  9. #9
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    J'ai testé itoa() à part et la limitation à 256 n'a rien à voir.

  10. #10
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    strtol est à préférer à itoa si disponible.

    Combien vaut sizeof(int) sur ton système ? Quelle est l'architecture cible ? Comment compiles-tu ? Quel est la sortie complète de la compilation ?

    Il te reste l'option de ne manipuler que des chaînes de caractères, sans passer par des entiers.

  11. #11
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Je compile sur un simulateur pour Arduino (Autodesk circuits.io)
    Je n'ai donc pas accès au résultat complet de la compilation.

    sizeof(int) me donne la valeur de 2 selon la machine hébergée.

    Je ne sais pas tester dans un autre environnement car je n'ai ni le keypad, ni le LCD pour mon Arduino.

    J'ai essayé un code "résumé" sur mon PC avec CodeBlocks et je n'ai pas d'erreur donc çà fonctionne.

    Serait-ce un bug du simulateur, je n'en sais rien...
    J'ai tout de même envoyé un mail aux développeurs Autodesk.

  12. #12
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Si sizeof(int) == 2 et en supposant CHAR_BIT == 8, on ne peut pas y coder 275012 puisque les maxima sont (rappel) : 32767 en signé et 65536 en non signé. Utilise des chaînes de caractères pour stocker les codes.

  13. #13
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ah, je n'ai plus l'habitude des systèmes où les int ne font que 16 bits...

    Mais dans ce cas, il est anormal qu'il n'y ait pas eu au moins un warning sur le int mastercode = 275012;! legrandse, tu devrais vérifier les options de compilation.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  14. #14
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Merci pour ces info.

    J'ai testé directement dans mon Arduino à la place du simulateur et le problème est identique (et même pas de warning dans le compilateur).

    Je suppose que c'est du à la limite de l'uC de l'Arduino.

    Merci beaucoup pour votre aide sur ce problème.

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

Discussions similaires

  1. Ajouter un caractère à une chaine
    Par susana.com dans le forum C
    Réponses: 2
    Dernier message: 21/04/2013, 13h40
  2. Ajouter des caractères à une chaine
    Par bestcasaoui dans le forum Langage
    Réponses: 1
    Dernier message: 28/03/2012, 13h52
  3. Problème de recherche de \ dans une chaine de caractères
    Par tus01 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 28/12/2010, 10h21
  4. Réponses: 1
    Dernier message: 17/06/2010, 16h10
  5. Réponses: 4
    Dernier message: 28/05/2008, 18h43

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