Aide au débugage - Comportement bizare d'une fonction...

Aide au débugage - Comportement bizare d'une fonction... - C - Programmation

Marsh Posté le 02-05-2005 à 02:52:08    

Ponchour alors voila pour un 'projet' à faire pour la fac (hum bon je pense que c'est charte compliant parceque je ne demande pas qu'on me fasse le programme à ma place mais  sinon je deleterais)
 
le probléme viens d'une fonction qui remplis un peu la meme fonction que getopt()
 
parcour les arguments donnés au programme
engeristre la position des arguments ansi que le nombre de leur parametre dans un tableau
 
voici le code :
 

Code :
  1. typedef struct _info {
  2. int present ;
  3. int nbparam ;
  4. } InfoArg;
  5. void Record(InfoArg *argument, int position, int *last_arg_position, InfoArg *last_argument) {
  6.       if (argument->present !=0) { 
  7.            exit(1);
  8.       }
  9.       if (last_argument == NULL) {
  10.            argument->present = position ;
  11.            last_argument = argument ;
  12.       }
  13.       else {
  14.            argument->present = position ;
  15.            last_argument->nbparam = argument->present - last_argument->present ;
  16.            last_argument = argument ;
  17.       }
  18. }
  19. void PrepareArg(int nb_arg, char *liste_arg[], InfoArg *liste_param){
  20. /* nb_arg = argc, *liste_arg[] = argv, liste_param l'adresse d'un tableau de InfoArg*/
  21. printf("  inside the analyse\n" );
  22. InfoArg *last_arg=NULL ;
  23. int nb = nb_arg ,
  24.     last_pos=0 ;
  25. printf("  debut boucle for\n" );
  26. for (nb = 1 ; nb < nb_arg ; nb++){
  27.  if (*liste_arg[nb]=='-');
  28.    switch (*++liste_arg[nb]) {
  29.     case 'm' :
  30.      Record(&liste_param[0], nb, &last_pos, last_arg);
  31.      break;
  32.     case 'f' :
  33.      Record(&liste_param[1], nb, &last_pos, last_arg);
  34.      break;
  35.     default :
  36.      printf("    insde teh switch\n" );
  37.      break;
  38.    }
  39. }
  40. }


 
Alors le probléme viens du fait que la fonction record ne modifie que argument->present et lors du second passage ne modifie pas last_argument->nbparam (last_argument est censé contenir l'adresse dans le tableau liste_param de l'argument precédent)
Aprés l'utilisation de plein de printf je me suis rendu compte que a chaque appel de record last_argument == NULL bien qu'il y ait l'affectation :  last_argument = argument
 
Voila auriez vous explication :??:
 
:jap:
 


---------------
LoD 4 ever && PWC spirit|Le topak de l'iMP-450|inDATOUNEwe trust
Reply

Marsh Posté le 02-05-2005 à 02:52:08   

Reply

Marsh Posté le 02-05-2005 à 07:13:42    


Y'a pas mal d'erreurs à commencer par un ';' après un if dans PrepareArg(). Ensuite, je dirais que si tu veux qu'une fonction modifie une valeur , il faut passer l'adresse de la variable contenant cette valeur. Dans Record(), on a  

          last_argument = argument ;


qui ne fait que modifier localement la valeur d'un paramètre...


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 02-05-2005 à 08:43:48    

C'est clair, c'est quoi la ligne 30 ?

Reply

Marsh Posté le 02-05-2005 à 13:04:28    

Emmanuel Delahaye a écrit :

Y'a pas mal d'erreurs à commencer par un ';' après un if dans PrepareArg(). Ensuite, je dirais que si tu veux qu'une fonction modifie une valeur , il faut passer l'adresse de la variable contenant cette valeur. Dans Record(), on a  

          last_argument = argument ;


qui ne fait que modifier localement la valeur d'un paramètre...


 
en effet ca irait mieu si je passait par adresse ^^
 
 

cesarr89 a écrit :

C'est clair, c'est quoi la ligne 30 ?


 
 
pour le if, a chaque foi qu'on avance dans le tableau on regarde si le premier char est '-' si c'est le cas c'est que c'est un argument donc on rentre dans le switch sinon on ne fait rien.
 
Et pour le ; du if je ne sais pas trop ce qu'il fait là surement un bout de code pas complêtement effacé  [:brainwasher]


---------------
LoD 4 ever && PWC spirit|Le topak de l'iMP-450|inDATOUNEwe trust
Reply

Marsh Posté le 02-05-2005 à 13:17:53    

ok

Reply

Sujets relatifs:

Leave a Replay

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