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

Arduino Discussion :

Copie des caractères d'un tableau vers un autre tableau donne des NUL


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut Copie des caractères d'un tableau vers un autre tableau donne des NUL
    Bonjour à tous,
    Je crois que je fais une erreur basique mais je ne vois pas où?
    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
    char sais[50];
    if(detectKb && !enSaisie) {         //lecture 1er caractère du clavier
        lcd.backlight();
        enSaisie = true;
        if(carLu == '0') sais[0] = 'O';   //remplacement de '0' par 'O'
        else sais[0] = carLu;
        afficMsgLcd(0,0,String(sais[0]),true);  //affichage de caractère saisi sur le lcd
        detectKb=false;
      }
      if(detectKb && enSaisie){           //lecture  complète du clavier caractère par caractère
        static uint8_t j=0;    
        if(carLu != 'C'){                      //jusqu'à la lettre 'C'
          j++;
          sais[j]=carLu;
          afficMsgLcd(j,0,String(sais[j]),false);
          detectKb=false;
        }
        else{                                      //fin de la saisie
          char saisiKb[j+2];
          for(i=0;i<j+1;i++){
            saisiKb[i]=sais[i];
            //Serial.print(saisiKb[i]); Serial.println(sais[i]);      
          }
          saisiKb[j+2]='\0';
          enSaisie = false;
          j=0;
     
          gestionCommandes(saisiKb);
          detectKb=false;
          if(!enAffic) lcd.noBacklight();
        }
      }
    je charge le tableau sais en saisissant un certain nombre de caractères par un clavier en terminant par 'C'.
    Ayant enregistré le nombre de caractères saisis en j, je crée un nouveau tableau char saisiKb[j+2];
    Puis je tente de copier les j caractères du tableau sais dans le tableau saisiKb.
    Je termine par le caractères '\0', puis j'appelle la procédure gestionCommandes en passant le tableau.
    Or cela ne fonctionne pas car j'ai découvert dans l'affichage du Serial que les deux tableaux ne contiennent que des caractères NUL.

    Merci d'éclairer ma lanterne..

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Bonjour,

    Je suppose que tout le bloc est dans la fonction loop(). Comment sont initialisées les variables detectKb et enSaisie lors de la 1ère exécution programme (lors de la mise sous tension de la carte) ? A quel moment detectKb est true ?

    Plusieurs éléments m'intriguent : en C++ les index des tableaux débutent à 0 et vont jusqu'à (n-1).
    Ici par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     char saisiKb[j+2];
    //.....
          saisiKb[j+2]='\0';
    ton tableau contient j+2 éléments mais son dernier index est j+1 pas j+2

    Le code contenu dans le else est exécuté si une des deux conditions de if(detectKb && enSaisie) est fausse (et non les deux en même temps). Je ne suis pas sûr que c'est ce que tu cherches.

    Pour copier une chaîne dans un tableau, tu peux utiliser strcpy

    Mon C++ est un peu rouillé, mais un static uint8_t sur une variable n'a pas d'intérêt. Déclare là en tant que variable globale.

  3. #3
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Merci Auteur de t'interessé à mon petit problème.
    Oui ce bloc est dans le loop.
    DetectKb , initialisé à false, devient true lors d'un interrupt généré par mon clavier de saisie.
    enSaisie est initialisé à false aussi.
    ton tableau contient j+2 éléments mais son dernier index est j+1 pas j+2
    Oui il contient j+1 élément du premier tableau et j'ajoute '\0' pour terminer le tableau.

    Le code contenu dans le else est exécuté si une des deux conditions de if(detectKb && enSaisie)
    non le else est exécuté si j'ai reçu le caractère 'C' de fin de saisie.

    Mon C++ est un peu rouillé, mais un static uint8_t sur une variable n'a pas d'intérêt. Déclare là en tant que variable globale.
    Si je suis obligé de mettre static car cette variable dois s'initialiser à zéro puis s'incrémenter à chaque nouvelle saisie d'un caractère.

    Je viens de modifier ma façon de lire les variables par le Serial ainsi;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serial.print(saisiKb[i]); Serial.print(" "); Serial.println(sais[i]);
    Et maintenant je vois que les caractères sont bons. Alors mon problème est ailleurs, sûrement dans ma procédure gestionCommandes(char *com) .
    Je continue mes recherches.

    ****************
    Le problème est dans la dernière ligne de ce paragraphe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sBt.printf("%s %c","Message reçu",commande);
    sBt est une instance Bluetooth et n'étant pas connecté cela bloque le fonctionnement.
    Alors j'ai modifié ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if(sBt.connected()) sBt.printf("%s %c","Message reçu",commande);
    et tout fonctionne parfaitement.
    Désolé de vous avoir sollicité pour rien.

    Merci encore

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 921
    Par défaut
    Postez tout le code sinon on va se perdre en conjectures

  5. #5
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Bonjour JAY M.
    Ne maîtrisant pas encore bien les tableaux et les pointeurs, je craignais que mon égalilé saisiKb[i]=sais[i] ne soit une hérésie.
    Ainsi je ne voyais pas l'utilité d'encombrer les pages de ce forum par plus d'une centaines de lignes.
    Je vous prie de m'excuser de vous avoir entraîné dans ces tardives conjectures.
    Bien cordialement
    Michel

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

Discussions similaires

  1. Copie physique d'une BDD SQL vers un autre serveur
    Par mlemonni dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/01/2008, 21h07
  2. Copie du contenu d'une eeprom vers une autre
    Par Aliveli dans le forum C
    Réponses: 9
    Dernier message: 05/06/2007, 18h51
  3. Réponses: 1
    Dernier message: 28/03/2007, 11h38
  4. copie d'une zone de texte vers une autre zone de texte
    Par db48752b dans le forum Access
    Réponses: 7
    Dernier message: 23/08/2006, 08h41
  5. Copie du contenu d'un répertoire vers un autre
    Par IG88 dans le forum Windows
    Réponses: 4
    Dernier message: 30/07/2004, 14h33

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