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

 C Discussion :

Remplacer le contenu d'un #define par une variable ?


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut Remplacer le contenu d'un #define par une variable ?
    Bonjour

    Je voudrai savoir si il est possible de remplacer l'intitulé d'un define par une variable déclarée dans le programme .

    Exemple, ici MAIL est défini pour contenir abc@dfg.fr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define MAIL             "abc@dfg.fr"
    si je veux que l'adresse email que contiendra #define MAIL puisse être variable et changée à tout moment, comment puis faire ?

    Mon programme utilise le contenu de #define MAIL ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case SMTP_MAILFROM:
    strcpypgm2ram(VarString, (ROM char *) "Envoye par :<" MAIL ">\r\n" );
    goto SmtpTaskDetailString;
    Mon but étant de laisser la possibilité à l'utilisateur du programme d'entrer dans une textbox l'adresse mail souhaitée pour qu'ensuite celle ci soit utilisée par le programme .

    Je vous remercie de votre aide,

  2. #2
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 634
    Par défaut
    Salut,

    ce n'est pas possible de changer une define en cour de route puisque après le passage du pré-compilateur toute les occurrences de MAIL seront remplacée par la chaine "abc@dfg.fr".

    Pour pourvoir la modifier tu peux déclarer une variable globale.

    char *mail;
    Ceci en dehors d'un block.
    Ainsi cette variable sera accessible de partout dans ton fichier.

    Cordialement,
    NeoKript

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci, mais si je remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define MAIL             "abc@dfg.fr"
    par
    Alors la ligne suivante me renvoi une erreur de syntaxe, pourriez vous me dire ce qu'il ne va pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpypgm2ram(VarString, (ROM char *) "Envoye par :<" MAIL ">\r\n" );
    En fait il faudrait que MAIL soit remplacé par son contenu

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Passe par un buffer intermédiaire pour composer ton message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char buf[.....];
    sprintf(buf ,"Envoye par :<%s>\r\n",MAIL );
    strcpypgm2ram(VarString, (ROM char *) buf);

  5. #5
    Membre émérite Avatar de SofEvans
    Homme Profil pro
    Développeur C
    Inscrit en
    Mars 2009
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Mars 2009
    Messages : 1 084
    Par défaut
    Ne pourrai-t'on pas remplacer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #define EXEMPLE "chaine de caractere"
    Par une constante global ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char [] = "chaine de caractere";
     
    #include ...
    ....
     
    int main ()
    {
        ...
    }

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pas pour tout ce qui exige une chaîne littérale (comme la concaténation par le compilateur même).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Citation Envoyé par diogene Voir le message
    Passe par un buffer intermédiaire pour composer ton message :
    Diogene, lorsque je compile ton code, j'ai un Warning :
    Warning [2066] type qualifier mismatch in assignment

    Pour faire mes essais, j'ai déclaré MAIL ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char MAIL[32] = {'a','b','c', '@', 'e','s','s','a','i','.','f','r'};
    Peux tu me dire ce qu'il ne va pas ?

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je ne vois pas. D'ailleurs, je ne vois pas d'assignation dans le code tel que montré.

    Par ailleurs, il faut terminer correctement ton tableau MAIL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char MAIL[32] = {'a','b','c', '@', 'e','s','s','a','i','.','f','r', '\0'};
    // ou
    char MAIL[32] = "abc@essai.fr";

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    En fait je suis bloqué.
    Je vais vous indiquer le fond de mon problème :

    Je voudrai modifier un pilote : SMTP.c afin qu'il soit possible, depuis mon programme principal ( main.c ) de modifier les paramètres qui sont personnalisables.

    Je joins mes fichier smtp.c

    Par exemple dans smtp.c, on définit avec un define STMP_USER et SMTP_PASSWORD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #define SMTP_USER       "MOI"     	//  entrer entre les guillemets le smtp user
    #define SMTP_PASSWORD   "GO"   //  entrer entre les guillemets le password de votre compte SMTP
    Je voudrais pouvoir, depuis mon programme principal : main.c changer le contenu des ces paramètres.

    Actuellement, ils sont en résident dans le code de mon programme, mais je voudrai que l'utilisateur puisse les changer à sa guise.

    L'ideal serait qu'ils soient remplacés par des chaines de caractères "char"
    Mais le pb est que si je défini un char xxx [...]; dans main.c, cette même variable n'est pas lisible par smtp.c ...

    Pourriez vous me dire comment vous vous y prendriez pour rendre les paramètres # define modifiables ?
    Fichiers attachés Fichiers attachés
    • Type de fichier : c SMTP.c (44,6 Ko, 1643 affichages)

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Pourriez vous me dire comment vous vous y prendriez pour rendre les paramètres # define modifiables ?
    Non, on ne peux pas. Les #define provoquent une substitution de caractères dans le code au tout début du processus de compilation.

    Mais le pb est que si je défini un char xxx [...]; dans main.c, cette même variable n'est pas lisible par smtp.c ...
    Apparemment, SMTP_USER et SMTP_PASSWORD ne sont utilisés que par la fonction SMTPTask(void). Deux solutions sont à priori envisageables

    - Changer les #define SMTP_xxxx par extern char SMTP_xxxx[....] et placer la définition de ces tableaux en global dans ton main

    - Ou supprimer les #define SMTP_xxxx et changer le prototype de la fonction SMTPTask(void) en SMTPTask(char * mes) et dans le corps de la fonction SMTPTask remplacer les SMTP_xxxx par mes. Modifier les appels à SMTPTask() en conséquence.

  11. #11
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    diogene,

    J'ai remplacé dans mon fichier SMTP.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define SMTP_USER       "abcd"
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern char SMTP_USER[20]="abcd";
    mais mon compilateur n'est pas ravi ...

    il m'indique ceci :
    SMTP.c:1084:Fatal [151] -internal- populateExternalReferences() - symbol 'SMTP_USER' is not an external reference

    Auriez vous une idée du problème ?
    Je vous remercie,

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Sépare ainsi:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    extern char SMTP_USER[];
    char SMTP_USER[20]="abcd";
    Ou si tu n'utilises SMTP_USER que dans un seul fichier source, supprime carrément le "extern" (ou la première ligne de mon code).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Ca compile bien à présent, cependant la chaine de caractère entrée par le biais de "char" ne semble pas être lu correctement par le programme ( je me rend compte de cela grâce à un débug qui détaille les étapes de l'envoi de mon email via hyperteminal )

    Si j'utilise les #define, le programme lit bien les contenus definis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define SMTP_FROM       "abc@def.fr"
    Le débug me donne les infos suivantes, tout est Ok, la chaine de caractères contenue dans SMTP_FROM est bien lue et reprise par le programme :

    HELO
    MAIL FROM:<abc@def.fr>


    Si par contre je remplace :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define SMTP_FROM       "abc@def.fr"
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    extern char SMTP_FROM[];
    char SMTP_FROM[32]="abc@def.fr";
    Alors le contenu de SMTP_FROM apparait avec caractères non lisibles ...

    HELO
    ´ûo¶šìðkì_ð(0)



    Pourriez vous me dire ce qui génère ce problème ?

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Impossible sans plus de détails.
    Mais ça peut être lié aux pointeurs ROM et autres. C'est un code pour un système embarqué?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Oui, c'est du C pour PIC Microchip.

    Que te faudrait il comme infos ou fichiers ?

    Je suis prêt à poster mes autres fichiers composant mon projet, mais je ne veux pas surcharger le forum.

    Les #define ne sont remplacables que par des char ?

    Je voudrai que les données qui y sont contenus soient personnalisables durant l'execution du programme .

  16. #16
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Peut-être qu'il faut un préfixe ROM quelque part dans la déclaration ou dans l'utilisation que tu en fais.

    Tout ça c'est du truc non-standard, donc on ne peut pas vraiment te répondre à moins de s'y connaître en PIC...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  17. #17
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Pour utiliser un char à la place du #define j'ai remplacé la ligne suivante par celle ci, peut etre que le pb d'affichage vient de là ?

    ligne d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpypgm2ram(VarString, (ROM char *) "MAIL FROM:<" SMTP_FROM ">\r\n" );
    ligne modifiée suite à l'utilisation de char :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strcpypgm2ram(VarString, (ROM char *) SMTP_FROM);
    Peut etre que ma syntaxe n'est pas bonne et cela générerai l'affichage de caractères non lisibles ?

  18. #18
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je crois que cela vient du qualificatif ROM qui doit spécifier que le pointeur pointe en rom et non en ram. Effectivement, avec le #define, la chaine est en rom alors qu'avec le tableau elle est en ram. Il est normal alors que tu obtiennes n'importe quoi.

    Je ne sais pas ce que fait réellement strcpypgm2ram(), mais elle semble copier une chaîne en rom dans un tableau en ram, donc elle serait alors inutile ici !
    Sinon, j'ignore si la fonction strcpypgm2ram() tolère un pointeur vers la ram. Peut être essayer en supprimant ROM, (si le pointeur est ram par défaut, probable) ou en le remplaçant par RAM ou ram (en espérant qu'il existe un tel mot-clé) ?

  19. #19
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    En remplacant par ceci, ça compile mais les caractères sont toujours illisibles ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcpypgm2ram(VarString, (char *) SMTP_FROM);

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 77
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char * mail = "mail@server.fr";

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/05/2015, 16h31
  2. [AC-2013] remplacer le nom d'un formulaire par une variable dans un Public Sub
    Par GuyDuLac dans le forum VBA Access
    Réponses: 2
    Dernier message: 24/10/2014, 17h23
  3. [XL-2010] Remplacer le nom d un onglet par une variable
    Par toto92 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 04/02/2014, 16h40
  4. Réponses: 14
    Dernier message: 24/02/2012, 17h04
  5. Remplacer le contenu d'un div par un autre
    Par prgasp77 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/10/2004, 23h48

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