Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3008 connectés 

  FORUM HardWare.fr
  Programmation
  C

  retour de valeur en c

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

retour de valeur en c

n°2106987
zownierd
Posté le 18-10-2011 à 17:43:04  profilanswer
 

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

mood
Publicité
Posté le 18-10-2011 à 17:43:04  profilanswer
 

n°2106992
shaoyin
Posté le 18-10-2011 à 18:09:04  profilanswer
 

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.

n°2107026
breizhbugs
Posté le 18-10-2011 à 20:47:30  profilanswer
 

Et encoderChar() ressemble à quoi?


---------------
Seul Google le sait...
n°2107041
xilebo
noone
Posté le 18-10-2011 à 21:26:05  profilanswer
 


 
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
n°2107104
zownierd
Posté le 19-10-2011 à 10:45:03  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  retour de valeur en c

 

Sujets relatifs
[RESOLU] Récupération valeur bouton radio et textarea - formulaireC# : problème avec retour de valeur (return int)
[python] valeur de retour d'un programmeextraire une valeur d'un tableau en retour de fonction
expect + tester valeur retour d'un scriptExplode sur une valeur de retour
Execution d'un void main(args[]) en java et valeur retourMain et valeur de retour
Peut ont recupére la valeur de retour d'une fonction JS dans du php?[.net] Valeur de retour d'une requête SQL
Plus de sujets relatifs à : retour de valeur en c


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR