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. #21
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    en procédant ainsi j'ai Error [1109] type mismatch in redeclaration of 'SMTP_FROM'


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    extern char SMTP_FROM[];
    char * SMTP_FROM = "mail@server.fr";
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcpypgm2ram(VarString, (char *) SMTP_FROM);

  2. #22
    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
    Comme je l'ai dit plus haut, je pense que le problème vient de l'utilisation de la fonction strcpypgm2ram() qui copie de rom en ram (Il faudrait confirmer en lisant la documentation de strcpypgm2ram() si on ne veut pas continuer à l'aveuglette).
    Or tu as maintenant un message déjà en ram puisque tu as défini un tableau.

    Tu devrais remplacer cette fonction, lorsqu'elle est utilisée dans ce cas, par un simple strcpy() (ou un strcat() ou un sprintf() selon le besoin), donc une construction de chaines de ram en ram, dans la fonction SMTPTask() (fonction assez dégueue avec ses goto dans des case ramenant au beau milieu d'autres case !):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
            static BYTE      VarString[50];
    ....
           case SMTP_AUTH_USERNAME:
               // Base 64 encode and transmit the username.
               strcpypgm2ram((VarString + 20),  (ROM char *) SMTP_USER); // USER NAME
               SMTPClient.szRAM = (VarString + 20);   // usa dal byte 20 in su
               RAMStrPtr = SMTPClient.szRAM;   // da 0 a
    ...
          case SMTP_AUTH_PASSWORD:
               // Base 64 encode and transmit the password
               strcpypgm2ram((VarString + 20), (ROM char *) SMTP_PASSWORD);
               SMTPClient.szRAM = (VarString + 20);
               RAMStrPtr = SMTPClient.szRAM;
    ...
          case SMTP_DATA_HEADER:
               if (!SMTPClient.Flag.SendMessgType)
               {
                   SMTPState++;
                   strcpypgm2ram(VarString, (ROM char *) SMS_FREE_FROM "\r\n");
                   goto SmtpTaskDetailString;
    ...
          case SMTP_MAILFROM:
               //strcpypgm2ram(VarString, (ROM char *) "MAIL FROM:<" SMTP_FROM ">\r\n" );
               strcpypgm2ram(VarString, (ROM char *) SMTP_FROM);
               //sprintf(info_sender ,"Send from : <%s>\r\n",SMTP_FROM );
    	   //strcpypgm2ram(VarString, (ROM char *) info_sender);
               goto SmtpTaskDetailString;

  3. #23
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    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 ?
    smptp.c

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    #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
     
    static char *USER=NULL ;
    static char *PASS=NULL ;
     
    void InitFields ( void )
    {
       USER = strdup (SMTP_USER);
       PASS = strdup (SMTP_PASSWORD);
    }
     
    void GetFields ( char **User, char **Pass )
    {
       *User = strdup (USER);
       *Pass = strdup (PASS);    
    }
     
    void SetFields ( char *NewUser, char *NewPass )
    {
       if ( USER != NULL )
        {
            free(USER);
            USER = NULL ;
        }
       if ( PASS != NULL )
        {
            free(PASS);
            PASS = NULL ;
        }
     
       USER = strdup (NewUser);
       PASS = strdup (NewPass);    
    }


    main.c

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main ( int argc, char **arv )
    {
       char *OldUser, *OldPass ;
       char *NewUser, *NewPass ;
     
       InitFields ();
    ...
       GetFields(&OldUser, &OldPass);
    ....
       SetFields ( NewUser, NewPass);
     
       return EXIT_SUCCESS ;
    }

  4. #24
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Je te remercie souviron34 mais ton code semble encore faire appel à des #define mon but serait de les supprimer et les remplacer à des char pour que les chaines soient modifiables pendant l'execution du programme.

    --

    De mon côté, j'ai essayé ceci, ça fonctionne en partie seulement, car j'ai un pb avec le qui est doit être inséré en fin de chaine de SMTP_FROM:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Ceci remplace #define SMTP_USER : Fonctionne bien.
    extern rom char SMTP_USER[];
    ROM char SMTP_USER[30];
     
    Ceci remplace SMTP_PASSWORD : Fonctionne bien.
    extern ROM char SMTP_PASSWORD[];
    ROM char SMTP_PASSWORD[35];
     
    Ceci remplace SMTP_FROM : Pose pb !
    extern ROM char SMTP_FROM[];
    ROM char SMTP_FROM[32];
    Mon problème se situe ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case SMTP_MAILFROM:
     
    // Avant : Fonctionne bien si on utilise #define :
    strcpypgm2ram(VarString, (ROM char *) "MAIL FROM:<" SMTP_FROM ">\r\n" );
     
    goto SmtpTaskDetailString;
    Maintenant que SMTP_FROM est déclaré par un ROM char, je ne sais pas comment lui ajouter en fin de chaine \r\n comme cela est fait plus haut avec #define.

    La ligne ROM char SMTP_FROM[32]; contiendra une chaine directement entrée par l'utilisateur pendant l'execution du programme, donc sa longueur ne sera pas connue à l'avance ( au moment ou le programme sera compilé ) , comment puis je faire ajouter \r\n en fin de chaine SMTP_FROM ?

    A titre d'essai ceci, la compilation se passe bien mais l'execution du programme ne se passe pas normalement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    										 case SMTP_MAILFROM:
    strcpypgm2ram(VarString, (rom char *)SMTP_FROM);
    strcatpgm2ram(VarString, (rom char *)"\r\n");
    goto SmtpTaskDetailString;
    Pourriez vous m'aider svp ?

  5. #25
    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
    Mais si SMTP_FROM[32] est en ROM, tu ne pourras plus le modifier !
    As-tu vu mon message précédent ?

  6. #26
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    si je déclare ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char SMTP_FROM[];
    char SMTP_FROM[32]="adresse@test.com";
    et modifie la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    case SMTP_MAILFROM:
     
    strcpy (VarString, SMTP_FROM);
    strcat(VarString,"\r\n");
     
    goto SmtpTaskDetailString;
    Alors le code compile mais le programme affiche de nouveau des caractères non lisibles ...

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


    Pourtant, le case SMTP_MAILFROM ne fait appel qu'a des chaines stockées en RAM, peut etre est la fonction SmtpTaskDetailString qui pose pb ? ( elle se trouve à la fin du ficher smtp.c )

  7. #27
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char SMTP_FROM[];
    char SMTP_FROM[32]="adresse@test.com";
    Pourquoi as-tu DEUX définitions de SMTP_FROM ?

  8. #28
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    c'est une erreur de copié / collé .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    extern char SMTP_FROM[];
    ROM char SMTP_FROM[32]="adresse@test.com";

  9. #29
    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
    Enfin, as-tu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ROM char SMTP_FROM[32]="adresse@test.com";
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char SMTP_FROM[32]="adresse@test.com";
    ???

  10. #30
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Désolé, voici ce que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    external char SMTP_FROM[];
    char SMTP_FROM[32]="adresse@test.com";
    Avec ceci , les caractères envoyés ne sont pas lisibles.

  11. #31
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    Je te remercie souviron34 mais ton code semble encore faire appel à des #define mon but serait de les supprimer et les remplacer à des char pour que les chaines soient modifiables pendant l'execution du programme.
    ...
    Pourriez vous m'aider svp ?
    Simplement parce que je croyais que dans ton code c'était ce que tu souhaitais..

    ça ne change strictement rien à mon exemple si ce ne sont pas des define...


    smtp.c :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    char *SMTP_USER="MOI";
    char *SMTP_PASSWORD="GO";
     
    static char *USER=NULL ;
    static char *PASS=NULL ;
     
    void InitFields ( void )
    {
       USER = strdup (SMTP_USER);
       PASS = strdup (SMTP_PASSWORD);
    }
     
    void GetFields ( char **User, char **Pass )
    {
       *User = strdup (USER);
       *Pass = strdup (PASS);    
    }
     
    void SetFields ( char *NewUser, char *NewPass )
    {
       if ( USER != NULL )
        {
            free(USER);
            USER = NULL ;
        }
       if ( PASS != NULL )
        {
            free(PASS);
            PASS = NULL ;
        }
     
       USER = strdup (NewUser);
       PASS = strdup (NewPass);    
    }

    main.c

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main ( int argc, char **arv )
    {
       char *OldUser, *OldPass ;
       char *NewUser, *NewPass ;
     
       InitFields ();
    ...
       GetFields(&OldUser, &OldPass);
    ....
       SetFields ( NewUser, NewPass);
     
       return EXIT_SUCCESS ;
    }

    ou toute autre combinaison équivalente...

    par exemple :

    smtp.c

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    static char *USER=NULL ;
    static char *PASS=NULL ;
     
    void InitFields ( void )
    {
       USER = strdup("MOI");
       PASS = strdup ("GO");
    }
     
    void GetFields ( char **User, char **Pass )
    {
       *User = USER ;
       *Pass = PASS ;    
    }
     
    void SetFields ( char *NewUser, char *NewPass )
    {
       if ( USER != NULL )
        {
            free(USER);
            USER = NULL ;
        }
       if ( PASS != NULL )
        {
            free(PASS);
            PASS = NULL ;
        }
     
       USER = strdup (NewUser);
       PASS = strdup (NewPass);    
    }

    main.c

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main ( int argc, char **arv )
    {
       char *OldUser, *OldPass ;
       char *NewUser, *NewPass ;
     
       InitFields ();
    ...
       GetFields(&OldUser, &OldPass);
    ....
       SetFields ( NewUser, NewPass);
     
       return EXIT_SUCCESS ;
    }

    ou bien


    smtp.c :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char *USER=NULL ;
    char *PASS=NULL ;
     
    void InitFields ( void )
    {
       USER = strdup("MOI");
       PASS = strdup ("GO");
    }

    main.c

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    extern char *USER, *PASS ;
     
    int main ( int argc, char **arv )
    {
      char *NewU=NULL, *NewP=NULL ;
     
       InitFields ();
    ...
       fprintf ( stdout, "Ancien usager [%s] et mot de passe [%]", USER, PASS );   
    ....
       ... / * Demande et récupère nouveaux * /
           .....
         tmp = realloc ( USER, strlen(NewU)+1 );
         if ( tmp != NULL )
           {
               USER = tmp ;
               strcpy ( USER, NewU );
           }
        ...
       return EXIT_SUCCESS ;
    }

  12. #32
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci , je vais essayer de m'inspirer des modifications que vous me proposez dans SMTP.c

    Cependant ce que je cherche à faire est un peu différent de votre proposition, je me suis mal expliqué ( désolé )

    Dans mon SMTP.c ( ci - joint )

    je voudrais remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define SMTP_USER       "LOGIN"     			
    #define SMTP_PASSWORD   "PASSWORD"
    #define SMTP_FROM             "NAME@TEST.COM"
    #define SMS_FREE_FROM         "test"
    par des extern char ( variables définies en RAM ) afin qu'elles sont modifiables pendant l'execution du programme.

    Actuellement SMTP.c à ses fonctions d'envoi d'email basé avec des paramètres figés, définis par des #define soit un stockage en ROM.

    Le fait de modifier le code et passer par des paramètres définis par des char, soit un stockage en RAM, necessite de modifier les autres fonctions de SMTP.c qui font appel aux #define remplacés par des char ...

    Et cela, je ne sais justement pas comment faire.

    Je vous remercide de votre aide et patience
    Fichiers attachés Fichiers attachés
    • Type de fichier : c SMTP.c (44,4 Ko, 84 affichages)

  13. #33
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par lcoulon Voir le message
    Cependant ce que je cherche à faire est un peu différent de votre proposition, je me suis mal expliqué ( désolé )

    Dans mon SMTP.c ( ci - joint )

    je voudrais remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define SMTP_USER       "LOGIN"     			
    #define SMTP_PASSWORD   "PASSWORD"
    #define SMTP_FROM             "NAME@TEST.COM"
    #define SMS_FREE_FROM         "test"
    par des extern char ( variables définies en RAM ) afin qu'elles sont modifiables pendant l'execution du programme.
    ..
    Je ne sais pas où tu a appris à lire, mais mes exemples ci-dessus fonctionnent exactement comme ça....

  14. #34
    Membre éclairé
    Inscrit en
    Septembre 2008
    Messages
    384
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 384
    Par défaut
    Merci pour ta remarque, mais mon pb se situe ici :

    Actuellement SMTP.c à ses fonctions d'envoi d'email basé avec des paramètres figés, définis par des #define soit un stockage en ROM.

    Le fait de modifier le code et passer par des paramètres définis par des char, soit un stockage en RAM, necessite de modifier les autres fonctions de SMTP.c qui font appel aux #define remplacés par des char ...

  15. #35
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    je ne comprend rien...

    On t'a donné toutes les solutions..

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