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 :

Concaténation de char/string


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 137
    Par défaut Concaténation de char/string
    Salut

    Je programme en C un système de capture à intervalle régulier (toutes les 5 minutes), tout est Ok

    Le problème pour moi est de mémoriser dans une variable char l'heure de l'évènement de la capture sous forme 00h00.
    La concaténation en langage C étant ce qu'elle est, pas moyen depuis plusieurs jours de trouver la bonne syntaxe.

    Dans bien d'autres langages, je n'ai pas de problèmes, mais en C, c'est la catastrophe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    now = rtc.now();
    byte heure = now.hour(); // 0 à 23
    byte minute = now.minute(); // 0 à 59
     char[6] HeureCapture; // "00h00"
     
    if (heure<10){ HeureCapture ="0";}
    HeureCapture = HeureCapture + heure + "h"; // ====> erreur 
    if (minute<10){ HeureCapture =HeureCapture + "0";}// ====> erreur
    HeureCapture = HeureCapture + minute;// ====> erreur
    Mon système de capture tourne sur un Arduino nano, je suis donc obligé de limiter un maximum les librairies pour rester dans l'espace de stockage du composant.

    Un coup de main me serai très utile.
    Par avance merci de votre aide.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 754
    Par défaut
    Hello,

    Une des solutions, parce-qu'il y en a deux, serait d'utiliser sprintf

    C'est la méthode la plus lisible. La fonction sprintf (String Print Formatted) agit comme un print, mais écrit dans votre variable au lieu d'écrire dans la console.

    Elle gère nativement le zéro devant les chiffres (le %02d).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    // Déclaration globale ou locale
    char HeureCapture[6]; // 5 caractères + 1 caractère de fin de chaîne '\0'
     
    // ... dans votre boucle loop ou fonction ...
     
    // %02d signifie : entier décimal sur 2 chiffres minimum, comblé par des 0
    sprintf(HeureCapture, "%02dh%02d", heure, minute);
     
    // Résultat automatique : "09h05", "14h30", etc.
    • Avantage : Une seule ligne, très propre, gère tout (conversion int vers char + concaténation).
    • Inconvénient : La librairie stdio.h (qui contient sprintf) peut ajouter environ 1.5 Ko à 2 Ko à la taille de votre programme compilé. Sur un Nano, c'est parfois trop.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 137
    Par défaut
    Merci de votre réponse
    hélasse, cette solution je l'avais aperçu lors de mes recherche, d’ailleurs je l'ai expérimenter dans un mini programme qui donnait le bon résultat, mais en tentant de l'intégrer dans le programme principal, dés #include <stdio.h>, le compilateur me criait dessus, dépassement de capacité.
    Il faut dire que j'ai déjà 5 librairies pour mon projet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>
    #include <RTClib.h>
    #include <SoftwareSerial.h>
    #include <SD.h>
    Je vais continuer à expérimenter de mon coté sans cette librairie, et reviendrait sur ce postage.

    Merci encore
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 735
    Par défaut
    Salut,

    En restant dans la lignée de la question, il est possible de faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char HeureCapture[]= "00h00";
    HeureCapture[0]= heure/10 +'0';
    HeureCapture[1]= heure%10 +'0';
    //...pareil pour minute en 3 et 4
    Après, il faudrait vérifier si les entêtes déjà inclus n'utilisent pas la classe String ou similaire, dans quel cas elle serait disponible sans frais.

  5. #5
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 137
    Par défaut
    Merci à vous deux
    Je suis arrivé à cette solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //declaration en début de programme
    byte HeurCapt[]={0,1};
     
    //lors de la capture pour retenir l'heure
    	now = rtc.now();
    	HeurCapt[0]=now.hour();
    	HeurCapt[1]=now.minute();
     
    //Ailleurs dans une fonction pour l'affichage sur le LCD
    	if (HeurCapt[0]<10){lcd.print("0");}
    	lcd.print(HeurCapt[0]);lcd.print("h");
    	if (HeurCapt[1]<10){lcd.print("0");}
    	lcd.print(HeurCapt[1]);
    Peut être du bricolage, mais ne prend pas beaucoup de mémoire et me permet de me passer de la librairie <stdio.h>.
    Encore merci, vos propositions me serviront sans doute dans un autre projet.
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    Membre Expert
    Femme Profil pro
    ..
    Inscrit en
    Décembre 2019
    Messages
    735
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 95
    Localisation : Autre

    Informations professionnelles :
    Activité : ..

    Informations forums :
    Inscription : Décembre 2019
    Messages : 735
    Par défaut
    Salut,

    J'ai regardé vite fait et rtclib a bien une fonction de conversion, char* DateTime::toSring(char* formatted_buffer_to_convert), ce qui par exemple, permet d'écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buffer[]= "hh:mm";
    lcd.print(now.toString(buffer));
    voici la liste des spécificateurs:

     specifier | output                                                 
    -----------|--------------------------------------------------------
     YYYY      | the year as a 4-digit number (2000--2099)              
     YY        | the year as a 2-digit number (00--99)                  
     MM        | the month as a 2-digit number (01--12)                 
     MMM       | the abbreviated English month name ("Jan"--"Dec")      
     DD        | the day as a 2-digit number (01--31)                   
     DDD       | the abbreviated English day of the week ("Mon"--"Sun") 
     AP        | either "AM" or "PM"                                    
     ap        | either "am" or "pm"                                    
     hh        | the hour as a 2-digit number (00--23 or 01--12)        
     mm        | the minute as a 2-digit number (00--59)                
     ss        | the second as a 2-digit number (00--59)                
    Maintenant, si le croquis (sketch) est déjà bien chargé et les options de compilation optimales, ce n’est pas sûr que ça change quelque chose vu la taille de la fonction en question, mais bon, c'était juste pour info.

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

Discussions similaires

  1. convertion char* --> String
    Par chester119 dans le forum C++/CLI
    Réponses: 6
    Dernier message: 24/03/2009, 13h45
  2. Problème d'affectation Char String
    Par smail21 dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2007, 01h00
  3. Transtypage int => char, String => char
    Par autregalaxie dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 10/04/2007, 14h48
  4. char *, string et tableau statique ou dynamique
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 12h33
  5. Réponses: 3
    Dernier message: 27/05/2004, 00h03

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