Partage
  • Partager sur Facebook
  • Partager sur Twitter

Macro Langage C

    10 novembre 2022 à 21:01:19

    Bonjour j'ai un sujet prétendument simple dont j'arrive pas à trouver la réponse malgré de longs moment de recherches sur le net.

    J'ai dans mon code source des fprintfs / sprintfs contenant des dates mais je n'arrive pas à trouver une macro approprié qui remplacera uniquement la date

    Voici les printfs que j'ai dans mon code source :

    #define Changement1() sprintf(date_en_cours_chn,"10/11/2022");
    #define Changement2() fprintf(MAKHACHKALA,"DATE : 10/11/2022");
    #define Changement3() sprintf(date_en_cours,"10/11/2022");
    #define Changement4() sprintf(jour_02_en_cours,"10");
    #define Changement5() sprintf(mois_02_en_cours,"11");
    #define Changement6() sprintf(annee_02_en_cours,"2022");

    J'ai essayé de contourner le problème en utilisant une macro qui remplace toute la ligne mais s'il faut changer manuellement toutes les datesà chaque ligne  au bout de 30 / 40 fois ça sera assez pesant.

    En prenant par exemple la première ligne, en écrivant :

    #define MACRODATE 10/11/2022

    C'est la chaine de caractère MACRDATE qui sera inscrite date_en_cours par exemple au lieu de la date.

    Merci pour vos réponses

    -
    Edité par DannyOndaye 12 novembre 2022 à 13:33:13

    • Partager sur Facebook
    • Partager sur Twitter
      10 novembre 2022 à 22:07:18

      Salut,

      Pourquoi ne pas faire des fonctions ?

      Je suis inquiet quand tu dis que tu changes manuellement plein de dates, et que tu parles de 30 à 40 fois ? 

      Tu as fais massivement du copier/coller ?


      N'oublie pas que le langage C a été pensé à une époque les éditeurs de texte ne proposaient pas de copier/coller....

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        10 novembre 2022 à 22:12:21

        Bonjour, Merci de supprimer toutes les lettres en capitales de votre titre. Et tant qu'à faire écrire un titre en rapport avec votre problématique. 

        Majuscules abusives

        L'écriture en majuscules est considérée comme une parole criée et diminue autant la lisibilité du texte que sa compréhension. Les majuscules abusives sont donc interdites aussi bien dans les titres que dans les messages.

        Liens conseillés

        • Partager sur Facebook
        • Partager sur Twitter
          10 novembre 2022 à 23:13:21

          Bonsoir,

          Je dois avouer que je ne comprends pas. Peux-tu poster l'énoncé au complet et le code que tu as écrit / qu'on t'a donné ?

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            11 novembre 2022 à 13:59:25

            __TIME__, __DATE__ //sont donc 2 macron build-in
            
            //Il te return un truc comme "Jan 14 2012"
            //Or la taille sera il me semble fix
            
            #define CURR_DAY Tu_fais_un_truc(__DATE__)
            
            //soit tu utilise des fonctions pour couper ton macro, mais dans ce as autant faire direct de CURR_DAY un macro
            
            //soit tu essayes de couper la date et l'heur avec d'autres macro ou je ne sais quelles méthodes de macro astucieuses
            • Partager sur Facebook
            • Partager sur Twitter
              11 novembre 2022 à 14:05:06

              Le problème, c'est qu'on ne comprend pas ce que tu souhaites faire ? Ce n'est donc pas simple de te donner une réponse concrète.
              • Partager sur Facebook
              • Partager sur Twitter
              ...
                11 novembre 2022 à 15:33:58

                Merci à tous RouIoudeVadim_Kashtanovedgarjacobs et Fvirtman

                Lezs macros _TIME_ et _DATE_ proposées sont plûtot pas mal mais en fait j'écris un programme qui réagit différemment selon que la date entre 2 compilations est la même ou totalement différente.

                Donc pour lancer des essais sur mon programme, je suis obligé de chanter manuellement la date. J'ai voulu utiliser le code suivant comme variable global :

                          int h, min, s, day, mois, an;
                          time_t now;
                
                          // Renvoie l'heure actuelle
                          time(&now);
                          // Convertir au format heure locale
                          ///printf("Aujourd'hui est : %s", ctime(&now));
                          struct tm *local = localtime(&now);
                          h = local->tm_hour;
                          min = local->tm_min;
                          s = local->tm_sec;
                          day = local->tm_mday;
                          mois = local->tm_mon + 1;
                          an = local->tm_year + 1900;

                Mais le problème est qu'on le faisant le compilateur me renvoie une erreur pour avoir utiliser struct dans une déclaration globale

                La macro que j'ai essayé de monter est donc à la base pour palier ce problème sauf qu'elle est peut trop longue.

                -
                Edité par DannyOndaye 11 novembre 2022 à 15:35:19

                • Partager sur Facebook
                • Partager sur Twitter
                  11 novembre 2022 à 15:55:54

                  à tout hasard, est-ce que quelque chose comme ceci résout ton problème :

                  /* set the following macros */
                  #define DAY     "10"
                  #define MONTH   "11"
                  #define YEAR    "2022"
                  
                  /* use them */
                  #define DATE    DAY "/" MONTH "/" YEAR
                  #define Changement1() sprintf(date_en_cours_chn, DATE);
                  #define Changement2() fprintf(MAKHACHKALA,"DATE : " DATE);
                  #define Changement3() sprintf(date_en_cours, DATE);
                  #define Changement4() sprintf(jour_02_en_cours, DAY);
                  #define Changement5() sprintf(mois_02_en_cours, MONTH);
                  #define Changement6() sprintf(annee_02_en_cours, YEAR);
                  

                  (non testé)

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 novembre 2022 à 15:58:55

                    @DannyOndaye Bonjour, merci de modifier le titre comme demandé.

                    La modération

                    • Partager sur Facebook
                    • Partager sur Twitter
                      11 novembre 2022 à 16:04:38

                      DannyOndaye a écrit:

                      Donc pour lancer des essais sur mon programme, je suis obligé de chanter manuellement la date. J'ai voulu utiliser le code suivant comme variable global 

                      Alors en C, on ne peut pas mettre de code en dehors des fonctions, seulement des définition de variables global.

                      • Partager sur Facebook
                      • Partager sur Twitter
                      ...
                        12 novembre 2022 à 13:37:09

                        Dlks a écrit:

                        à tout hasard, est-ce que quelque chose comme ceci résout ton problème :

                        /* set the following macros */
                        #define DAY     "10"
                        #define MONTH   "11"
                        #define YEAR    "2022"
                        
                        /* use them */
                        #define DATE    DAY "/" MONTH "/" YEAR
                        #define Changement1() sprintf(date_en_cours_chn, DATE);
                        #define Changement2() fprintf(MAKHACHKALA,"DATE : " DATE);
                        #define Changement3() sprintf(date_en_cours, DATE);
                        #define Changement4() sprintf(jour_02_en_cours, DAY);
                        #define Changement5() sprintf(mois_02_en_cours, MONTH);
                        #define Changement6() sprintf(annee_02_en_cours, YEAR);
                        

                        (non testé)

                        Voilà un code qui se rapprocherait plus de ce que je veux faire c'est d'ailleurs par ça que j'ai commencé lorsque j'écrivais mes macros.

                        Malheuresement lorsque je le teste lors de la commpile j'obtiens ça :

                                Date en cours (-DATE-) vs (-10/11/2022-) Date lu
                                Jour en cours (-DAY-) vs (-10-) Jour lu
                                Mois en cours (-MONTH-) vs (-11-) Mois lu
                                Ann. en cours (-YEAR-) vs (-2022-) Ann. luAppuyez sur une touche pour continuer...



                        -
                        Edité par DannyOndaye 12 novembre 2022 à 13:56:39

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 novembre 2022 à 11:52:37

                          Bonjour, quelqu'un aurait-il ne fusse qu'un début de solution ? o_O

                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 novembre 2022 à 12:20:43

                            Salut DannyOndaye,

                            Je ne sais pas comment tu utilises tes macros, mais lorsque je teste ceci :

                            #include <stdio.h>
                              
                            /* set the following macros */
                            #define DAY     "10"
                            #define MONTH   "11"
                            #define YEAR    "2022"
                            
                            /* use them */
                            #define DATE    DAY "/" MONTH "/" YEAR
                            #define Changement1() sprintf(date_en_cours_chn, DATE);
                            
                            int main(void) {
                                    char date_en_cours_chn[256];
                                    Changement1()
                            
                                    printf("date_en_cours_chn = %s\n", date_en_cours_chn);
                                    return 0;
                            }
                            


                            Cela compile et s'exécute ainsi :

                            $ gcc -Wall -Wextra macros.c 
                            $ ./a.out 
                            date_en_cours_chn = 10/11/2022

                            Sinon, voilà une solution alternative qui t'évite d'avoir à taper toi même la date et qui parse le contenu de __DATE__ dans des variables globales.

                            #include <stdio.h>
                            #include <string.h>
                            
                            char build_year[5];
                            char build_month[3];
                            char build_day[3];
                            char build_date[11];
                            
                            void init_build_vars(void) {
                                    /* year */
                                    sprintf(build_year, "%c%c%c%c", __DATE__[7], __DATE__[8], __DATE__[9], __DATE__[10]);
                                    /* month */
                                    char st[4] = { '\0' };
                                    sprintf(st, "%c%c%c", __DATE__[0], __DATE__[1], __DATE__[2]);
                                    if (strcmp(st, "Jan") == 0) strcpy(build_month, "01");
                                    if (strcmp(st, "Feb") == 0) strcpy(build_month, "02");
                                    if (strcmp(st, "Mar") == 0) strcpy(build_month, "03");
                                    if (strcmp(st, "Apr") == 0) strcpy(build_month, "04");
                                    if (strcmp(st, "May") == 0) strcpy(build_month, "05");
                                    if (strcmp(st, "Jun") == 0) strcpy(build_month, "06");
                                    if (strcmp(st, "Jul") == 0) strcpy(build_month, "07");
                                    if (strcmp(st, "Aug") == 0) strcpy(build_month, "08");
                                    if (strcmp(st, "Sep") == 0) strcpy(build_month, "09");
                                    if (strcmp(st, "Oct") == 0) strcpy(build_month, "10");
                                    if (strcmp(st, "Nov") == 0) strcpy(build_month, "11");
                                    if (strcmp(st, "Dec") == 0) strcpy(build_month, "12");
                                    /* day */
                                    sprintf(build_day, "%c%c", __DATE__[4], __DATE__[5]);
                                    if (build_day[0] == ' ') build_day[0] = '0';
                                    /* date */
                                    sprintf(build_date, "%s/%s/%s", build_day, build_month, build_year);
                            }
                            
                            int main(void) {
                                    init_build_vars();
                            
                                    printf("build_year = %s\n", build_year);
                                    printf("build_month = %s\n", build_month);
                                    printf("build_day = %s\n", build_day);
                                    printf("build_date = %s\n", build_date);
                            
                                    return 0;
                            }

                            qui donne :

                            $ gcc -Wall -Wextra parse_compilation_date.c 
                            $ ./a.out 
                            build_year = 2022
                            build_month = 11
                            build_day = 14
                            build_date = 14/11/2022
                            

                            On devrait aussi pouvoir utiliser sscanf() pour parser le texte dans __DATE__ pour éviter de traiter par char.

                            Comme ce code n'a pas besoin d'être modifié pour produire un résultat différent à la compilation, si tu utilises un système de build pour produire ton exécutable (comme make), il faudra forcer la recompilation systématique de ce fichier (autrement si le source n'est pas modifié depuis la dernière compilation, il ne sera pas recompilé et la date ne sera pas mise à jour).

                            De ce point de vue, la première solution, plus simple, te force à modifier le source (à condition que tu n'oublies pas de le faire).

                            Avec un Makefile, tu peux aussi précéder la compilation d'une commande awk ou sed qui modifie ton source en intégrant les informations de date souhaitées directement dans ton code. Il y a plein d'autres solutions...

                            -
                            Edité par Dlks 14 novembre 2022 à 12:32:50

                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 novembre 2022 à 13:40:27

                              DannyOndaye a écrit:

                              Bonjour, quelqu'un aurait-il ne fusse qu'un début de solution ? o_O

                              Pour cela, il faudrait que tu expliques ce que tu souhaites faire. Parce que les portions de code que tu postes, n'indique pas ce que tu souhaites faire.

                              (Ça t'a été demandé plusieurs fois).

                              • Partager sur Facebook
                              • Partager sur Twitter
                              ...
                                15 novembre 2022 à 16:04:01

                                Dlks a écrit:

                                Salut DannyOndaye,

                                Je ne sais pas comment tu utilises tes macros, mais lorsque je teste ceci :

                                #include <stdio.h>
                                  
                                /* set the following macros */
                                #define DAY     "10"
                                #define MONTH   "11"
                                #define YEAR    "2022"
                                
                                /* use them */
                                #define DATE    DAY "/" MONTH "/" YEAR
                                #define Changement1() sprintf(date_en_cours_chn, DATE);
                                
                                int main(void) {
                                        char date_en_cours_chn[256];
                                        Changement1()
                                
                                        printf("date_en_cours_chn = %s\n", date_en_cours_chn);
                                        return 0;
                                }
                                


                                Cela compile et s'exécute ainsi :

                                $ gcc -Wall -Wextra macros.c 
                                $ ./a.out 
                                date_en_cours_chn = 10/11/2022

                                -
                                Edité par Dlks hier à 12:32



                                Merci Dlks t'es un génie lol, j'ai réessayer le code que tu m'as passé. Effectivement date_en_cours_chn marche bien

                                Il restait un problème. Lorsque j'utilisais le fprintf en macro :

                                #define ChangeDate2() fprintf(MAKHACHKALA,"Aujourd'hui on est le DATE");  

                                Je retrouvais "Aujourd'hui on et le Date" (sans remplacement)

                                J'avais pas compris qu'il fallait que je change le format. Avec le code qui suit j'ai finalement trouvé ce qu'il fallait faire :

                                #define ChangeDate2() fprintf(MAKHACHKALA,"Aujourd'hui on est le %s",DATE); 

                                PS:J'avais jamais appris que des fois une macro doit se passer à l'aide de %s o_O

                                -
                                Edité par DannyOndaye 15 novembre 2022 à 16:05:32

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  15 novembre 2022 à 21:18:08

                                  Salut DannyOndaye,

                                  #define ChangeDate2() fprintf(MAKHACHKALA,"Aujourd'hui on est le %s",DATE); PS:J'avais jamais appris que des fois une macro doit se passer à l'aide de %s o_O

                                  En fait, c'est la syntaxe de sprintf(), qui est basée sur celle de printf(). Là tu te contentes d'utiliser le spécificateur %s qui suppose une chaîne. La macro DATE est simplement remplacée par la chaîne contenant la date et donc c'est la chaîne attendue par le spécificateur %s. Le %s est approprié car DATE est une chaîne, c'est tout. Si la macro DATE avait été un int, il fallait utiliser %d, etc.

                                  D'ailleurs, tu aurais aussi pu écrire fprintf(MAKHACHKALA,"Aujourd'hui on est le " DATE); comme tu l'avais écrit dans ton post d'origine.

                                  La raison est que le préprocesseur va fusionner des chaînes juxtaposées (comme pour la construction de DATE à partir de JOUR "/" MOIS "/" ANNEE). Le résultat du traitement par le préprocesseur préalable à phase de compilation est que le compilateur se retrouve avec une (seule) chaîne.

                                  Cette propriété permet aussi de tronquer un printf trop long pour qu'il tienne sur une largeur d'environ 70 caractères et s'affiche joliment pour le lecteur du code source.

                                          printf("Mais encore que je me reconnaisse extrêmement sujet a faillir, "
                                                  "et que je ne me fie quasi jamais aux premiers pensées qui me "
                                                  "viennent, toutefois l'expérience que j'ai des objections "
                                                  "qu'on me peut faire m'empêche d'en espérer aucun profit qui me "
                                                  "viennent.\n");
                                  

                                  Une fois le préprocesseur passé, le compilateur verra :

                                          printf("Mais encore que je me reconnaisse extrêmement sujet a faillir, et que je ne me fie quasi jamais aux premiers pensées qui me viennent, toutefois l'expérience que j'ai des objections qu'on me peut faire m'empêche d'en espérer aucun profit qui me viennent.\n");




                                  -
                                  Edité par Dlks 15 novembre 2022 à 21:33:32

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Macro Langage C

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                  • Editeur
                                  • Markdown