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
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
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.
__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
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
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.
à 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
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;
}
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...
Bonjour, quelqu'un aurait-il ne fusse qu'un début de solution ?
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.
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;
}
#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
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
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.
Recueil de code C et C++ http://fvirtman.free.fr/recueil/index.html
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent