Printf chaine de 2 caratcères variables
Répondre à la discussion
Affichage des résultats 1 à 21 sur 21

Printf chaine de 2 caratcères variables



  1. #1
    RATAXES64

    Printf chaine de 2 caratcères variables


    ------

    Bonjour à toutes et tous,
    Novice que je suis (je découvre le langage C depuis peu...), je galère avec les chaines de caractères(en me limitant pourtant à 2 caractères!).
    J'arrive à "quelque chose de correct" en recourant au plus basique (variable JJ dans le code).
    Mais je suppose qu'il y a plus élégant, et surtout plus approprié pour des chaines de caractères plus longues : ce que j'ai essayé de faire avec la variable DD... sans succès...
    Visiblement je ne maitrise pas du tout une syntaxe, et ni même mes recherches, dont les différents résultats restent hors de ma compréhension...
    Je pensais , à tort, que mes 40 ans de VB aideraient mes vieux neurones à venir à bout de ce traitement de chaine de caractères ; que je trouve quand même surprenant de complexité...
    Alors je m'en remets à une âme charitable (et compatissante) pour me mettre sur de bons rails et éclairer ma lanterne vacillante.
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #define Bcd2Dec(BcdNum) BcdNum, 0x10, 10                  	                // BcdNum, 0x10, 10 ?
    #define Dec2Bcd(DecNum) DecNum, 10, 0x10                                        // DecNum, 10, 0x10 ?
    
    int main()
    {
        int c1,c2,c3,c4,c5,c6,c7;                                                   // Pour Affichages Dec et tmp[x] (datas en format  0x02d pour correctifs RTC)
        int x1,x2,x3,x4,x5,x6,x7;                                                   // Pour Affichages BCD
        char DD[7][3]={"Ln","Ma","Me","Je","Ve","Sa","Di"};      	                // Solution 1 pour Affichage ID Jour en string de 2 lettres selon Numero  du jour
        char JJ[25];                                                                // Solution 2 pour Affichage ID jour en string de 2 lettres selon Numero  du jour
    
       	c1=0; 							                // Secondes (0 a 59)
        x1=Bcd2Dec(c1);					                        // c1 en BCD
        c2=8; 							                // Minutes (0 a 59)
        x2=Bcd2Dec(c2); 					                        // c2 en BCD
       	c3=15;						                        // Heure (0 a 23)
        x3=Bcd2Dec(c3); 					                        // c3 en BCD
        c4=3;							                // Numero du Jour (1 à 7)
        x4=Bcd2Dec(c4); 					                        // c4 en BCD
    
        if(c4==1){DD[0][0];}                                                        // Ln = Lundi       (1er string de 2 lettres + '0/')
        else if(c4==2){DD[1][3];}                                               	// Ma = Mardi       (2eme string de 2 lettres + '0/')
        else if(c4==3){DD[2][3];}                                               	// Me = Mercredi    (3eme string de 2 lettres + '0/')
        else if(c4==4){DD[3][3];}                                               	// Je = Jeudi       (4eme string de 2 lettres + '0/')
        else if(c4==5){DD[4][3];}                                               	// Ve = Vendredi    (5eme string de 2 lettres + '0/')
        else if(c4==6){DD[5][3];}                                               	// Sa = Samedi      (6eme string de 2 lettres + '0/')
        else {DD[6][3];}                                                            // Di = Dimanche    (7eme string de 2 lettres + '0/')
    
        if(c4==1){JJ[0] = 'L';JJ[1] = 'n';JJ[2]='\0';}                          	// Ln = Lundi       (1er string de 2 lettres + '0/')
        else if(c4==2){JJ[0] = 'M';JJ[1] = 'a';JJ[2]='\0';}		                // Ma = Mardi       (2eme string de 2 lettres + '0/')
        else if(c4==3){JJ[0] = 'M';JJ[1] = 'e';JJ[2]='\0';}                     	// Me = Mercredi    (3eme string de 2 lettres + '0/')
        else if(c4==4){JJ[0] = 'J';JJ[1] = 'e';JJ[2]='\0';}                     	// Je = Jeudi       (4eme string de 2 lettres + '0/')
        else if(c4==5){JJ[0] = 'V';JJ[1] = 'e';JJ[2]='\0';}                     	// Ve = Vendredi    (5eme string de 2 lettres + '0/')
        else if(c4==6){JJ[0] = 'S';JJ[1] = 'a';JJ[2]='\0';}                     	// Sa = Samedi      (6eme string de 2 lettres + '0/')
        else {JJ[0] = 'D';JJ[1] = 'i';JJ[2]='\0';}                              	// Di = Dimanche    (7eme string de 2 lettres + '0/')
    
        c5=6; 							                // Date du Jour (1 a 31)
        x5=Bcd2Dec(c5); 					                        // c5 en BCD
        c6=9; 							                // Mois (1 a 12)
        x6=Bcd2Dec(c6); 					                        // c6 en BCD
        c7=23; 						                        // An
        x7=Bcd2Dec(c7); 					                        // c7 en BCD
    
        // Affichages
        printf("saisie Secondes  >%02d ; tmp[1]>0x%02d (BCD>%03d) \n",c1,c1,x1);
        printf("saisie Minutes   >%02d ; tmp[2]>0x%02d (BCD>%03d) \n",c2,c2,x2);
        printf("saisie Heures    >%02d ; tmp[3]>0x%02d (BCD>%03d) \n",c3,c3,x3);
        printf("saisie Jour (DD) >%s ; tmp[4]>0x%02d (BCD>%03d) \n",DD,c4,x4);      // !!!FAUX!!!
        printf("saisie Jour (JJ) >%s ; tmp[4]>0x%02d (BCD>%03d) \n",JJ,c4,x4);      // VRAI
        printf("saisie Date      >%02d ; tmp[5]>0x%02d (BCD>%03d) \n",c5,c5,x5);
        printf("saisie Mois      >%02d ; tmp[6]>0x%02d (BCD>%03d) \n",c6,c6,x6);
        printf("saisie An        >%02d ; tmp[1]>0x%02d (BCD>%03d) \n",c7,c7,x7);
        return 0;
    }
    Le résultat affiché en console: FAUX avec variable DD...
    RTC_ID-Jour.jpg

    J'ai également beaucoup de Warnigns et des "notes".... (voir fichier pdf joint)

    Merci.

    -----
    Images attachées Images attachées
    Dernière modification par RATAXES64 ; 09/09/2023 à 13h58.

  2. #2
    RATAXES64

    Re : Printf chaine de 2 caratcères variables

    Précision : "J'ai également beaucoup de Warnings et des "notes".... (voir fichier pdf joint)" : J'utilise CodeBlock pour une première prise en main... Je n'en suis pas encore à programmer un PIC!

  3. #3
    RATAXES64

    Re : Printf chaine de 2 caratcères variables

    Bonjour à toutes et tous,

    100 fois sur le métier...
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        int c4=3;                                                                   // Saisie du numero du jour dans la semaine, ici =3 (Mercredi) : "Me"
        char JS[7][3]={"Ln","Ma","Me","Je","Ve","Sa","Di"};      	                // Affichage ID Jour DD en string de 2 lettres selon Numero  du jour
        printf("saisie Jour (JS=%d) >%s ; tmp[4]>0x%02d (BCD>%03d) \n",c4,c4==1?JS[0]:c4==2?JS[1]:c4==3?JS[2]:c4==4?JS[3]:c4==5?JS[4]:c4==6?JS[5]:JS[6],c4,x4);
        return 0;
    }
    C'est déjà plus "propre" (plus de warnings ni note), et ça retourne l'affichage attendu (ici "Me") ; mais ce me semble très contraignant... pour des strings plus longs ou des choix plus nombreux...
    Certes, on a un affichage qui va bien, mais comment récupérer le résultat JS selon c4 ? Un tableau ? une structure ?
    Je ne comprends toujours pas comment une chaine de caractère peut être traitée comme une donnée (variable par des if ou des case par exemple) ...
    Un truc du genre de ce que je connais en VB :

    if c4=1 then JS="Ln"...
    ou même inversement...
    if JS="Ln" then c4=1...

    Mais comment fait-on quelque chose d'aussi simple en C ?

    Merci de votre indulgence!

  4. #4
    RATAXES64

    Re : Printf chaine de 2 caratcères variables

    Correctif erreur de copie du code
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    #define Bcd2Dec(BcdNum) BcdNum                  	                            
    
    int main()
    {
        int c4=3;                                                                   // Saisie du numero du Jour dans la Semaine, ici c4=3 (Mercredi) : "Me"
        int x4;                                                                     // Pour Affichages BCD
        x4=Bcd2Dec(c4); 					                        // c4 en BCD 
        char JS[7][3]={"Ln","Ma","Me","Je","Ve","Sa","Di"};      	                // Affichage ID Jour JS en string de 2 lettres selon Numero du jour
        printf("saisie Jour (JS=%d) >%s ; tmp[4]>0x%02d (BCD>%03d) \n",c4,c4==1?JS[0]:c4==2?JS[1]:c4==3?JS[2]:c4==4?JS[3]:c4==5?JS[4]:c4==6?JS[5]:JS[6],c4,x4);
        return 0;
    }
    Dernière modification par RATAXES64 ; 10/09/2023 à 19h01.

  5. A voir en vidéo sur Futura
  6. #5
    Jack
    Modérateur

    Re : Printf chaine de 2 caratcères variables

    Bonjour.

    Quelques remarques:
    - je ne comprends pas trop pourquoi tu utilises des macros (#define ...) au lieu de fonctions. Je ne comprends d'ailleurs pas comment ces macro sont sensées réaliser la conversion.
    - pourquoi autant de variables? Tu pourrais remplacer c1 à c7 par une seule et même variable c.

    Bref, si j'ai bien compris, il te faut une fonction qui reçoit un nombre décimal et qui le convertit en une chaine représentant ce même nombre en BCD, c'est çà?

  7. #6
    Jack
    Modérateur

    Re : Printf chaine de 2 caratcères variables

    Pour les chaines, si tu programmes en C, il faut utiliser les fonctions de traitement des chaines, qui se nomment strxxx. Par exemple, pour comparer, c'est strcmp, pour copier strcpy, etc.
    Si tu passes au C++, il y a une classe string qui simplifie le traitement des chaines. Tu pourras par exemple écrire
    Code:
    if (jour == "Lu")
       c4 = 1;

  8. #7
    RATAXES64

    Re : Printf chaine de 2 caratcères variables

    Bonjour
    Merci Jack de le réponse.
    Je n'ai pas tout dit pour essayer de rester court
    Après une initialisation 'en dur' dans le programme, je veux pouvoir modifier les données que fournit une RTC (DS3231)
    Certaines seront à afficher "normalement" (Heure et minutes en format HH:MN) sur un LCD
    MAIS le nom des jours sera lui à afficher différemment.
    La RTC donne le N° du Jour (1 à 7) ; je voudrais afficher le nom du jour correspondant au N° fournit par la RTC sous forme de 2 Caractères.
    Pour '1' fournit par la RTC, j'aurai "Ln" à l'affichage pour le Lundi.
    A l'inverse, si je veux modifier le Jour dans la RTC, par exemple à Mardi, il faut que je lui "envoie" un '2'
    Mon souci pour le moment est d'au moins faire afficher les caractères correspondants au N° du jour...
    ... Et (tenter!) de comprendre comment se traitent les chaines de caractères en C : abyssal pour moi!

  9. #8
    Jack
    Modérateur

    Re : Printf chaine de 2 caratcères variables

    Citation Envoyé par RATAXES64 Voir le message
    Mon souci pour le moment est d'au moins faire afficher les caractères correspondants au N° du jour...
    Tu as raison, il faut progresser par étapes. Dans le sens là, c'est le plus facile:
    Code:
    // numJour est un entier correspondant au numéro du jour (1 à 7)
      printf(DD[numJour - 1]);
    En revanche, je ne comprends pas trop l'intérêt de passer de la chaine représentant le jour au numéro du jour. Il suffit de conserver dans ton programme une variable de type entier correspondant au numéro du jour. Le jour sont forme de chaine, c'est uniquement intéressant pour de l'affichage.

  10. #9
    albanxiii
    Modérateur

    Re : Printf chaine de 2 caratcères variables

    Bonjour,

    Citation Envoyé par Jack Voir le message
    Bref, si j'ai bien compris, il te faut une fonction qui reçoit un nombre décimal et qui le convertit en une chaine représentant ce même nombre en BCD, c'est çà?
    C'est risqué de faire ce genre de supposition à partir du code de quelqu'un qui vient demander des conseils

    Effectivement, à ce stade on ne sait toujours pas quel est le but du demandeur, ni ce qu'il cherche à faire.
    Not only is it not right, it's not even wrong!

  11. #10
    RATAXES64

    Re : Printf chaine de 2 caratcères variables

    Bonjour à tous,

    Citation Envoyé par albanxiii
    Effectivement, à ce stade on ne sait toujours pas quel est le but du demandeur, ni ce qu'il cherche à faire.
    Désolé, je pensais avoir été clair...

    Je veux afficher des chaines de caractères en fonction de nombres entiers.
    Par exemple, le Nom du Jour de la semaine (JS, ici limité à 2 caractères) en fonction d'un entier NJ de 1 à 7
    => Si 3ème jour : NJ = 3 ; affichage = Me (Mercredi)
    Dans le code ci-dessous, j'ai bien JS="Me" pour NJ=3
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        // NJ = Entier du jour de la semaine : 1 à 7 
        int NJ=3;
        //JS = ID du Jour de la semaine en 2 caractères
        char JS[7][3]={"Ln","Ma","Me","Je","Ve","Sa","Di"};
        // Affichage CodeBlock en console Windows 
        printf("RTC : NJ = %d \n",NJ);
        printf("LCD : JS = %s \n",NJ==1?JS[0]:NJ==2?JS[1]:NJ==3?JS[2]:NJ==4?JS[3]:NJ==5?JS[4]:NJ==6?JS[5]:JS[6]);
        return 0;
    }
    Questions :
    Peut-on faire "mieux", ou du moins plus "universel" ?
    Comment traiter X chaines, ayant chacune un nombre de caractères différent comme par exemple pour les 12 mois de l'année ?

    Citation Envoyé par jack
    // numJour est un entier correspondant au numéro du jour (1 à 7)
    printf(DD[numJour - 1]);
    Euh, là je ne comprends pas bien... aucun retour printf en console...

    A+

  12. #11
    Jack
    Modérateur

    Re : Printf chaine de 2 caratcères variables

    Citation Envoyé par albanxiii Voir le message
    Bonjour,

    C'est risqué de faire ce genre de supposition à partir du code de quelqu'un qui vient demander des conseils
    C'est pour ça que je demande confirmation avant d'avancer sur ce point.

  13. #12
    Jack
    Modérateur

    Re : Printf chaine de 2 caratcères variables

    Citation Envoyé par RATAXES64 Voir le message
    Bonjour à tous,

    Désolé, je pensais avoir été clair...
    Tu n'expliques toujours pas ce que faisaient tes macros Bin2Bcd et BcdtoBin.

    Sinon
    Euh, là je ne comprends pas bien... aucun retour printf en console...
    Code:
    #include <stdio.h>
    #include <stdlib.h>
    
    
    int main()
    {
        // NJ = Entier du jour de la semaine : 1 à 7 
        int NJ=3;
        //JS = ID du Jour de la semaine en 2 caractères
        char JS[7][3]={"Ln","Ma","Me","Je","Ve","Sa","Di"};
        // Affichage CodeBlock en console Windows 
        printf(DD[NJ - 1]);
        return 0;
    }
    Ca n'affiche pas Me ?

  14. #13
    RATAXES64

    Re : Printf chaine de 2 caratcères variables

    Citation Envoyé par Jack
    Ca n'affiche pas Me ?
    Non... J'ai une erreur "DD undeclared (first use in this function)"

    Citation Envoyé par Jack Voir le message
    Tu n'expliques toujours pas ce que faisaient tes macros Bin2Bcd et BcdtoBin.
    J'avais besoin par ailleurs d'afficher cette donnée (NJ) en BCD. J'ai trouvé cette fonction
    Code:
    #define Bcd2Dec(BcdNum) BcdNum
    (et non "BcdtoBin") dans l'aide CodeBlock et sur un autre forum
    Dernière modification par RATAXES64 ; 11/09/2023 à 11h18.

  15. #14
    RATAXES64

    Re : Printf chaine de 2 caratcères variables

    Aarrh...
    C'est pas DD ...
    Code:
    printf(DD[NJ - 1]);
    mais JS...
    Code:
    printf(JS[NJ - 1]);
    et c'est bon...!

    Merci... Je ais pouvoir avancer encore un peu plus dans la lumière du C
    Dernière modification par RATAXES64 ; 11/09/2023 à 11h54.

  16. #15
    Jack
    Modérateur

    Re : Printf chaine de 2 caratcères variables

    En effet, c'est parce que j'étais reparti de ton premier code où le tableau s'appelait DD.

  17. #16
    RATAXES64

    Re : Printf chaine de 2 caratcères variables

    Merci... Je vais pouvoir avancer un peu plus dans la lumière du C!
    Reste que j'ai défini des strings tous de 2 caractères dans mon tableau.
    Si j'avais voulu reprendre les noms complets des jours, j'aurais dû écrire :
    Code:
    char JS[7][9]={"Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"};

  18. #17
    umfred

    Re : Printf chaine de 2 caratcères variables

    Tu peux te passer de spécifier la longueur en passant par les pointeurs
    Code:
    char *JS[]={"Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"};
    tu récupères la taille du tableau par sizeof(JS) et la longueur de la chaine par strlen(JS[1]) par exemple

  19. #18
    Jack
    Modérateur

    Re : Printf chaine de 2 caratcères variables

    ou bien:
    Code:
    char JS[][9]={"Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"};

    mais ça consomme un poil plus de mémoire.
    Dernière modification par Jack ; 11/09/2023 à 13h44.

  20. #19
    umfred

    Re : Printf chaine de 2 caratcères variables

    Citation Envoyé par Jack Voir le message
    ou bien:
    Code:
    char JS[][9]={"Lundi","Mardi","Mercredi","Jeudi","Vendredi","Samedi","Dimanche"};

    mais ça consomme un poil plus de mémoire.
    Je lis le contraire ici http://cermics.enpc.fr/polys/info1/main/node90.html

  21. #20
    Jack
    Modérateur

    Re : Printf chaine de 2 caratcères variables

    Bin non, ma proposition consomme plus de mémoire vu que toutes les chaines ont la taille de la plus grande.

  22. #21
    umfred

    Re : Printf chaine de 2 caratcères variables

    oups j'avais mal compris ^^

Discussions similaires

  1. Pic XC8 et instruction printf
    Par invite2bee5fc6 dans le forum Électronique
    Réponses: 8
    Dernier message: 11/03/2015, 19h48
  2. Compilateur Pic XC8 et instruction printf
    Par invite1d5a7858 dans le forum Électronique
    Réponses: 5
    Dernier message: 23/04/2014, 06h57
  3. Bug avec un printf()
    Par invite8a7e1f83 dans le forum Programmation et langages, Algorithmique
    Réponses: 8
    Dernier message: 30/11/2012, 09h59
  4. atmel AT91SAM7X256 et printf ...
    Par invite099898f8 dans le forum Électronique
    Réponses: 4
    Dernier message: 21/04/2008, 09h10
  5. printf pour LCD
    Par Jack dans le forum Électronique
    Réponses: 3
    Dernier message: 10/08/2004, 17h21