retour de valeur en c

retour de valeur en c - C - Programmation

Marsh Posté le 18-10-2011 à 17:43:04    

Bonjour,
j'apprends actuellement le C en cours et j'ai eu un petit projet à faire, un programme qui coderait et décoderait du morse en langage clair.
 
J'en ai déjà fait un petit bout mais je suis bloqué depuis un bon moment et le prof un peu de mal à m'aider ...
 
voici la fonction en question

Code :
  1. char* encoderString(char *phrase)
  2. {
  3. unsigned int i;
  4. char resultat[MAX_CARACTERES_PAR_LIGNE] ="";
  5. for (i=0;i<strlen(phrase);++i)
  6. {
  7.  strcat(resultat,encoderChar(phrase[i]));
  8. }
  9. return resultat;
  10. }


 
et le main :
 
 

Code :
  1. int main(int argc, char *argv[])
  2. {
  3. char *test = "ABCDEFGHIJKLMNOPQR";
  4. printf("%s",encoderString(test));
  5. char c = getchar();
  6. return 0;
  7. }


 
le problème est que si j'ai bien compris, le ta'bleau "resultat" que j'ai créé dans la fonction est détruit dès qu'on quitte la fonction.
J'ai vu sur le net que procéder à une allocation dynamique du tableau pourrait peut-être le faire perdurer dans la main ...
j'ai donc remplacé la déclaration :

Code :
  1. char resultat[MAX_CARACTERES_PAR_LIGNE] ="";

par

Code :
  1. char* resultat = (char*) malloc(strlen(phrase)*sizeof(char));


seulement voilà ...
Visual studio plante et m'affiche :
 
Windows has triggered a breakpoint in progMorse.exe.
This may be due to a corruption of the heap, which indicates a bug in progMorse.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while progMorse.exe has focus.
The output window may have more diagnostic information.
 
mon prof m'a fait mettre un "static" devant la déclaration du tableau pour se rendre compte du problème mais ce n'est pas une solution très propre je trouve ...
 
 
Au cas ou l'un d'entre vous ait un bon éclaircissement à me fournir, je suis preneur :p

Reply

Marsh Posté le 18-10-2011 à 17:43:04   

Reply

Marsh Posté le 18-10-2011 à 18:09:04    

zownierd a écrit :


le problème est que si j'ai bien compris, le ta'bleau "resultat" que j'ai créé dans la fonction est détruit dès qu'on quitte la fonction.


exact !
 

zownierd a écrit :


J'ai vu sur le net que procéder à une allocation dynamique du tableau pourrait peut-être le faire perdurer dans la main ...
j'ai donc remplacé la déclaration :

Code :
  1. char resultat[MAX_CARACTERES_PAR_LIGNE] ="";

par

Code :
  1. char* resultat = (char*) malloc(strlen(phrase)*sizeof(char));



Déjà une remarque : si ta variable "resultat" est traitée comme une chaîne de caractères (puisque tu utilises strcat dessus), il faut prévoir aussi le caractère de fin de chaine donc +1 dans la taille du malloc.
 

zownierd a écrit :


seulement voilà ...
Visual studio plante et m'affiche :
 
Windows has triggered a breakpoint in progMorse.exe.
This may be due to a corruption of the heap, which indicates a bug in progMorse.exe or any of the DLLs it has loaded.
This may also be due to the user pressing F12 while progMorse.exe has focus.
The output window may have more diagnostic information.


Du coup, est-ce que cet horrible message ne viendrait pas du manque de place pour le caractère de fin de chaine ?
 

zownierd a écrit :


mon prof m'a fait mettre un "static" devant la déclaration du tableau pour se rendre compte du problème mais ce n'est pas une solution très propre je trouve ...


Disons que ta fonction n'est plus réentrante, mais ca n'est pas gênant dans un contexte non multithread.

Reply

Marsh Posté le 18-10-2011 à 20:47:30    

Et encoderChar() ressemble à quoi?


---------------
Seul Google le sait...
Reply

Marsh Posté le 18-10-2011 à 21:26:05    


 
Tu peux également passer par les paramètres de fonction pour retourner le résultat en passant l'adresse du buffer qui contiendra le résultat, plutot que de le retourner par le retour fonction.
 
Ex :
 

Code :
  1. void encoderString(char *phrase, char * resultat  )
  2. {
  3. for (i=0;i<strlen(phrase);++i)
  4. {
  5. strcat(resultat, encoderChar(phrase[i]) );
  6. }
  7. }
  8. int main()
  9. {
  10. char resultat[MAX_CARACTERES_PAR_LIGNE] = "";
  11. char *test = "ABCDEFGHIJKLMNOPQR";
  12. printf("%s",encoderString(test, resultat ));
  13. char c = getchar();
  14. return 0;
  15. }


 
Tip : j'ai juste modifié le code pour effectuer ce que je te propose, il manque évidemment un tas de tests ( comme vérifier la validité des pointeurs passés en paramètre par exemple ).


Message édité par xilebo le 18-10-2011 à 21:28:41
Reply

Marsh Posté le 19-10-2011 à 10:45:03    

merci beaucoup ca a marché ! je vais pouvoir continuer mon programme tranquille ^^:)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed