en procédant ainsi j'ai Error [1109] type mismatch in redeclaration of 'SMTP_FROM'
...Code:
1
2 extern char SMTP_FROM[]; char * SMTP_FROM = "mail@server.fr";
Code:
1
2 strcpypgm2ram(VarString, (char *) SMTP_FROM);
Version imprimable
en procédant ainsi j'ai Error [1109] type mismatch in redeclaration of 'SMTP_FROM'
...Code:
1
2 extern char SMTP_FROM[]; char * SMTP_FROM = "mail@server.fr";
Code:
1
2 strcpypgm2ram(VarString, (char *) SMTP_FROM);
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 :aie: avec ses goto dans des case ramenant au beau milieu d'autres case !):
Code:
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;
smptp.c
Code:
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:
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 ; }
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 lequi est doit être inséré en fin de chaine de SMTP_FROM:Code:/r/n
Mon problème se situe ici :Code:
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];
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.Code:
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;
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 :
Pourriez vous m'aider svp ?Code:
1
2
3
4 case SMTP_MAILFROM: strcpypgm2ram(VarString, (rom char *)SMTP_FROM); strcatpgm2ram(VarString, (rom char *)"\r\n"); goto SmtpTaskDetailString;
Mais si SMTP_FROM[32] est en ROM, tu ne pourras plus le modifier !
As-tu vu mon message précédent ?
si je déclare ainsi :
et modifie la fonction :Code:
1
2 char SMTP_FROM[]; char SMTP_FROM[32]="adresse@test.com";
Alors le code compile mais le programme affiche de nouveau des caractères non lisibles ...Code:
1
2
3
4
5
6 case SMTP_MAILFROM: strcpy (VarString, SMTP_FROM); strcat(VarString,"\r\n"); goto SmtpTaskDetailString;
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 )
Pourquoi as-tu DEUX définitions de SMTP_FROM ?Code:
1
2 char SMTP_FROM[]; char SMTP_FROM[32]="adresse@test.com";
c'est une erreur de copié / collé . :oops:
Code:
1
2 extern char SMTP_FROM[]; ROM char SMTP_FROM[32]="adresse@test.com";
Enfin, as-tu
ouCode:ROM char SMTP_FROM[32]="adresse@test.com";
???Code:char SMTP_FROM[32]="adresse@test.com";
Désolé, voici ce que j'ai :
Avec ceci , les caractères envoyés ne sont pas lisibles.Code:
1
2
3 external char SMTP_FROM[]; char SMTP_FROM[32]="adresse@test.com";
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:
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:
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:
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:
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:
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:
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 ; }
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 :
par des extern char ( variables définies en RAM ) afin qu'elles sont modifiables pendant l'execution du programme.Code:
1
2
3
4 #define SMTP_USER "LOGIN" #define SMTP_PASSWORD "PASSWORD" #define SMTP_FROM "NAME@TEST.COM" #define SMS_FREE_FROM "test"
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 ...:roll:
Et cela, je ne sais justement pas comment faire. :?
Je vous remercide de votre aide et patience :oops:
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 ...
je ne comprend rien...
On t'a donné toutes les solutions..