[c] erreur de segmentation

erreur de segmentation [c] - C - Programmation

Marsh Posté le 02-12-2009 à 19:07:01    

Bonjour,
 
j'ai écrit le code suivant en c il s'agit d'un correcteur orthographique:
 
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. short dichotomie(char **dico,char *mot_texte,int nbmots);
  6. void ajout(char **dico, char *mot_texte, int findico);
  7. char *sup_ponc(char *mot_texte);
  8. char *sup_maj(char *mot_texte);
  9. int compare_mots(const void *a, const void *b);
  10. void purger();
  11. #define MAXMOTS 100
  12. #define LONGMOT 20
  13. int main(int argc,char *argv[])
  14. {
  15. /*Déclarations des fichiers*/
  16. FILE *fichiertexte;
  17. FILE *fichierdico;
  18. /*Déclarations des variables*/
  19. int i,findico;
  20. char reponse[1];
  21. /*Déclarations des pointeurs*/
  22. char **dico;
  23. char *mot_texte;
  24. /*Allocation du pointeur *mot_texte*/
  25. mot_texte=malloc(LONGMOT*sizeof(char*));
  26. if (mot_texte==NULL)
  27. {
  28.   fprintf(stderr,"Allocation impossible \n" );
  29.   exit(EXIT_FAILURE);
  30. }
  31. /*Vérification du nombre d'arguments corrects à l'appel*/
  32. if (argc!=2)
  33.   {
  34.    printf("Erreur dans le nombre d'arguments\n" );
  35.    exit(EXIT_FAILURE);
  36.   }
  37. /*Ouverture des fichiers en lecture*/
  38. fichiertexte=fopen(argv[1],"r" );
  39. if (fichiertexte==NULL)
  40.   {
  41.    printf("Impossible d'ouvrir %s.\n", argv[1]);
  42.    exit(EXIT_FAILURE);
  43.   }
  44. fichierdico=fopen("dico.dat","r" );
  45. /*Lecture du fichier dico et stockage en mémoire dans le tabeau dico*/
  46. for(findico=0;!feof(fichierdico);findico++)
  47.   {
  48.    dico[findico]=malloc(LONGMOT*sizeof(char*));
  49.    fscanf(fichierdico,"%s",dico[findico]);
  50.    if (dico[findico]==NULL)
  51.     {
  52.      fprintf(stderr,"Allocation impossible \n" );
  53.      exit(EXIT_FAILURE);
  54.     }
  55.   }
  56. /*Fermeture du fichier dico.dat*/
  57. fclose(fichierdico);
  58. /*Tri du tableau dico*/
  59. qsort((char**)dico,MAXMOTS,LONGMOT,compare_mots);
  60. /*Lecture et traitement du fichier texte*/
  61. while(!feof(fichiertexte))
  62. {
  63.   fscanf(fichiertexte,"%s",mot_texte);
  64.   mot_texte=sup_ponc(mot_texte);
  65.   mot_texte=sup_maj(mot_texte);
  66.   if (dichotomie(dico,mot_texte,findico-1)==0)
  67.    {
  68.     printf("Le mot '%s' n'est pas dans le dictionnaire, voulez vous le rajouter (o/n) ?\n", mot_texte);
  69.     scanf("%s",reponse);
  70.     while((reponse[0]!='o') && (reponse[0]!='n'))
  71.      {
  72.       printf("Réponse invalide, recommencez\n" );
  73.       scanf("%s",reponse);
  74.       purger();
  75.      }
  76.     if(reponse[0]=='o') ajout(dico,mot_texte,findico);
  77.    }
  78. }
  79. /*Fermeture du fichier texte*/
  80. fclose(fichiertexte);
  81. /*Ouverture du fichier dico, écriture des éléments du tableau et fermeture*/
  82. fichierdico=fopen("dico.dat","w" );
  83. for(i=0;i<=findico;i++) fprintf(fichierdico,"%s",dico[i]);
  84. fclose(fichierdico);
  85. /*Libération des pointeurs en mémoire*/
  86. free(mot_texte);
  87. free(dico);
  88. return 0;
  89. }
  90. char *sup_ponc(char *mot)
  91. {
  92.   int lettre, lettresuiv;
  93.   for(lettre=0,lettresuiv=0;mot[lettresuiv];lettresuiv++)
  94.    {
  95.     mot[lettre]=mot[lettresuiv];
  96.     /* Si le caractère est une ponctuation, on l'ignore*/
  97.     if (ispunct(mot[lettresuiv])!=1) lettre++;
  98.    }
  99.   /*Pour terminer la chaîne:*/
  100.   mot[lettre]='\0';
  101.   return mot;
  102. }
  103. char *sup_maj(char *mot)
  104. {
  105.   int lettre;
  106.   for (lettre=0;mot[lettre];lettre++)
  107.    {
  108.     if (isupper(mot[lettre])) mot[lettre]=tolower(mot[lettre]);
  109.    }
  110.   return mot;
  111. }
  112. short dichotomie(char **dico,char *mot,int nbmots)
  113. {
  114. int i,j,k,x;
  115. i=0;
  116. j=nbmots;
  117.   /*Allocation du pointeur **dico*/
  118. for(x=0;x<=(nbmots+1);x++)
  119.   {
  120.    dico[x]=malloc(LONGMOT*sizeof(char*));
  121.    if (dico[x]==NULL)
  122.     {
  123.      fprintf(stderr,"Allocation impossible \n" );
  124.      exit(EXIT_FAILURE);
  125.     }
  126.   }
  127. while ((j-i)>1)
  128.   {
  129.    k=i+((j-i)/2);
  130.    if (((j-i)%2)==0) k++;
  131.    if (strcmp(mot,dico[k-1])==0) return 1;
  132.    if (strcmp(mot,dico[k-1])<0) j=(k-1);
  133.    else i=(k-1);
  134.   }
  135. if ((strcmp(dico[i],mot)==0) || (strcmp(dico[j],mot)==0)) return 1;
  136.   else return 0;
  137. }
  138. void ajout(char **dico,char *mot_texte,int findico)
  139. {
  140.   /*Si le le nombre de mots est supérieur à MAXMOTS, on affiche une erreur sinon on ajoute le mot a la fin du tableau*/
  141.   if(findico!=MAXMOTS)
  142.    {
  143.     dico[findico+1]=mot_texte;
  144.     findico++;
  145.    }
  146.   else
  147.    {
  148.     printf("Vous avez dépassé le nombre de mots maximal du dictionnaire" );
  149.     exit(EXIT_FAILURE);
  150.    }
  151.    /*On retri le tableau*/
  152.    qsort((char**)dico, MAXMOTS,LONGMOT,compare_mots);
  153. }
  154. int compare_mots(const void *chaine1, const void *chaine2)
  155. {
  156. return strcmp(chaine1,chaine2);
  157. }
  158. void purger(void)
  159. {
  160.   int c;
  161.   while ((c=getchar()) != '\n' && c != EOF)
  162.   {}
  163. }


 
Je compile avec gcc et il ne détecte aucune erreur, par contre l'exécution me donne une erreur de segmentation dès le lancement du programme. En utilisant gdb il me détecte une erreur sur cette ligne:
 
dico[findico]=malloc(LONGMOT*sizeof(char*));
 
Je ne vois pas le problème...  :pt1cable:
 
Merci d'avance pour votre aide ;)
jamsss


Message édité par jamsss le 02-12-2009 à 20:58:52
Reply

Marsh Posté le 02-12-2009 à 19:07:01   

Reply

Marsh Posté le 02-12-2009 à 20:09:37    

Salut

 

ton pointeur dico n'est pas initialisé donc dico[findico] plante. Il te manque un

 

dico = malloc ( longueur * sizeof(char**));

 

Et puis tu devrais faire ta vérification du pointeur avant de l'utiliser

Code :
  1. if (dico[findico] == NULL)
  2. {
  3.     //cas d'erreur
  4. }
  5. else
  6.     fscanf ...
 


Je ne suis pas sûr non plus que feof soit la bonne solution pour tester la fin du fichier, mieux vaudrait regarder le retour de fscanf (voire utiliser fgets). (Il faudrait que quelqu'un confirme pour feof)


Message édité par ptitchep le 02-12-2009 à 20:15:55

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 11-12-2009 à 19:04:25    

Bonjour,
 
Suite à tes remarques j'ai pu régler (je pense) les erreurs de segmentation par contre maintenant j'ai un autre soucis c'est que mon tableau dico[] ne contient pas vraiment les mots du texte mais après un test avec un printf il contient plutôt des choses de ce style : 0+��j ou P+��j ... Inutile de dire que pour la comparaison avec les mots du texte c'est pas génial... Je remet le code:
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. short dichotomie(char **dico,char *mot_texte,short nbmots);
  6. void ajout(char **dico, char *mot_texte, int findico);
  7. char *sup_ponc(char *mot_texte);
  8. char *sup_maj(char *mot_texte);
  9. int compare_mots(const void *a, const void *b);
  10. void purger();
  11. #define MAXMOTS 100
  12. #define LONGMOT 20
  13. int main(int argc,char *argv[])
  14. {
  15. /*Déclarations des fichiers*/
  16. FILE *fichiertexte;
  17. FILE *fichierdico;
  18. /*Déclarations des variables*/
  19. int i,findico;
  20. char reponse;
  21. /*Déclarations des pointeurs*/
  22. char **dico;
  23. char *mot_texte;
  24. /*Allocation des pointeurs */
  25. mot_texte=malloc(MAXMOTS*sizeof(char *));
  26. dico=malloc(MAXMOTS*LONGMOT*sizeof(char *));
  27. if (mot_texte==NULL)
  28.   {
  29.    fprintf(stderr,"Allocation impossible \n" );
  30.    exit(EXIT_FAILURE);
  31.   }
  32. /*Vérification du nombre d'arguments corrects à l'appel*/
  33. if (argc!=2)
  34.   {
  35.    printf("Erreur dans le nombre d'arguments\n" );
  36.    exit(EXIT_FAILURE);
  37.   }
  38. /*Ouverture des fichiers en lecture*/
  39. fichiertexte=fopen(argv[1],"r" );
  40. if (fichiertexte==NULL)
  41.   {
  42.    printf("Impossible d'ouvrir %s.\n", argv[1]);
  43.    exit(EXIT_FAILURE);
  44.   }
  45. fichierdico=fopen("dico.dat","r" );
  46. /*Lecture du fichier dico et stockage en mémoire dans le tabeau dico*/
  47. for(findico=0;!feof(fichierdico);findico++)
  48.   {
  49.    dico[findico]=malloc(LONGMOT*sizeof(char));
  50.     if (dico[findico]==NULL)
  51.     {
  52.      fprintf(stderr,"Allocation impossible \n" );
  53.      exit(EXIT_FAILURE);
  54.     }
  55.    else fscanf(fichierdico,"%s",dico[findico]);
  56.    printf("%s\n",dico[findico]);
  57.   }
  58. /*Fermeture du fichier dico.dat*/
  59. fclose(fichierdico);
  60. /*Tri du tableau dico*/
  61. qsort((char**)dico,MAXMOTS,LONGMOT,compare_mots);
  62. /*Lecture et traitement du fichier texte*/
  63. while(!feof(fichiertexte))
  64. {
  65.   fscanf(fichiertexte,"%s",mot_texte);
  66.   mot_texte=sup_ponc(mot_texte);
  67.   mot_texte=sup_maj(mot_texte);
  68.   if (dichotomie(dico,mot_texte,findico-1)!=1)
  69.    {
  70.     printf("Le mot '%s' n'est pas dans le dictionnaire, voulez vous le rajouter (o/n) ?\n", mot_texte);
  71.     reponse=getchar();
  72.     purger();
  73.     while((reponse!='o') && (reponse!='n'))
  74.      {
  75.       printf("Réponse invalide, recommencez\n" );
  76.       reponse=getchar();
  77.       purger();
  78.      }
  79.     if(reponse=='o') ajout(dico,mot_texte,findico);
  80.    }
  81. }
  82. /*Fermeture du fichier texte*/
  83. fclose(fichiertexte);
  84. /*Ouverture du fichier dico, écriture des éléments du tableau et fermeture*/
  85. fichierdico=fopen("dico.dat","w" );
  86. for(i=0;i<=findico;i++) fprintf(fichierdico,"%s",dico[i]);
  87. fclose(fichierdico);
  88. /*Libération des pointeurs en mémoire*/
  89. free(mot_texte);
  90. for (i=0;i<findico;i++) free(dico[i]);
  91. return 0;
  92. }
  93. char *sup_ponc(char *mot)
  94. {
  95.   int lettre, lettresuiv;
  96.   for(lettre=0;mot[lettresuiv];lettre++)
  97.    {
  98.     lettresuiv=lettre+1;
  99.     /* Si le caractère est une ponctuation, on l'ignore*/
  100.     if (ispunct(mot[lettre])!=0) strcpy(&mot[lettre],&mot[lettresuiv]);
  101.    }
  102.   /*Pour terminer la chaîne:*/
  103.   mot[lettre]='\0';
  104.   return mot;
  105. }
  106. char *sup_maj(char *mot)
  107. {
  108.   int lettre;
  109.   for (lettre=0;mot[lettre];lettre++)
  110.    {
  111.     if (isupper(mot[lettre])) mot[lettre]=tolower(mot[lettre]);
  112.    }
  113.   return mot;
  114. }
  115. short dichotomie(char **dico,char *mot,short nbmots)
  116. {
  117. int i,j,k,x;
  118. j=nbmots;
  119. i=0;
  120.   /*Allocation du pointeur **dico*/
  121. for(x=0;x<=nbmots;x++)
  122.   {
  123.    dico[x]=malloc(LONGMOT*sizeof(char));
  124.    if (dico[x]==NULL)
  125.     {
  126.      fprintf(stderr,"Allocation impossible \n" );
  127.      exit(EXIT_FAILURE);
  128.     }
  129.   }
  130. while ((j-i)>1)
  131.   {
  132.    k=i+((j-i)/2);
  133.    if (((j-i)%2)==0) k++;
  134.    if (strcmp(mot,dico[k-1])==0) return 1;
  135.    if (strcmp(mot,dico[k-1])<0) j=(k-1);
  136.    else i=(k-1);
  137.   }
  138. printf("%s\n",dico[i]);
  139. printf("%s\n",mot);
  140. if ((strcmp(dico[i],mot)==0) || (strcmp(dico[j],mot)==0)) return 1;
  141.   else return 0;
  142. }
  143. void ajout(char **dico,char *mot_texte,int findico)
  144. {
  145.   /*Si le le nombre de mots est supérieur à MAXMOTS, on affiche une erreur sinon on ajoute le mot a la fin du tableau*/
  146.   if(findico!=MAXMOTS)
  147.    {
  148.     dico[findico+1]=mot_texte;
  149.     findico++;
  150.    }
  151.   else
  152.    {
  153.     printf("Vous avez dépassé le nombre de mots maximal du dictionnaire" );
  154.     exit(EXIT_FAILURE);
  155.    }
  156.    /*On retri le tableau*/
  157.    qsort((char**)dico, MAXMOTS,LONGMOT,compare_mots);
  158. }
  159. int compare_mots(const void *chaine1, const void *chaine2)
  160. {
  161. return strcmp(chaine1,chaine2);
  162. }
  163. void purger(void)
  164. {
  165.   int c;
  166.   while ((c=getchar()) != '\n' && c != EOF)
  167.   {}
  168. }


 
Merci
 
PS: feof marche bien pas de soucis de ce côté la ;)


Message édité par jamsss le 11-12-2009 à 19:07:21
Reply

Marsh Posté le 12-12-2009 à 11:50:50    

Le remplissage du tableau dico semble bon, le problème viendrai plutôt du qsort, quelqu'un à une idée ?

Reply

Marsh Posté le 12-12-2009 à 14:58:29    

Il faut donner la taille des éléments à échanger, donc c'est peut-être plutôt sizeof(char *) que LONGMOT. A tester bien entendu.

Reply

Marsh Posté le 13-12-2009 à 18:39:45    

oui en effet c'est bien ça j'ai vu ça entre temps, merci à toi ;)

Reply

Marsh Posté le 16-12-2009 à 00:12:27    

Bon le programme fonctionne presque... je n'ai plus d'erreur de segmentation mais j'ai un problème au niveau de la fonction "ajout" (elle sert à ajouter un mot à la fin du fichier dico en passant par le tableau dico si le mot du texte n'est pas existant). Donc cette fonction marche de temps en temps...
 
Exemple:
 
Voila le contenu du fichier texte:
 
http://ups.imagup.com/06/1260964416.jpg
 
Celui du fichier dico:
 
http://ups.imagup.com/06/1260964618.jpg
 
Et voila ce qu'il se passe
 
http://ups.imagup.com/06/1260965452.jpg
 
Le programme plante... Dans certains cas, ça passe (c'est sûrement du mot au mot ou bien au nombre de mots) j'ai tout essayé mais je ne comprends pas  :pfff:  :pfff:  :pfff: je remet le code complet:
 

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <ctype.h>
  5. short dichotomie(char **dico,char *mot_texte);
  6. void ajout(char **dico, char *mot_texte);
  7. char *sup_ponc(char *mot_texte);
  8. char *sup_maj(char *mot_texte);
  9. int compare_mots(const void *a, const void *b);
  10. void purger();
  11. int nbmots;
  12. #define MAXMOTS 100
  13. #define LONGMOT 20
  14. int main(int argc,char *argv[])
  15. {
  16. /*Déclarations des fichiers*/
  17. FILE *fichiertexte;
  18. FILE *fichierdico;
  19. /*Déclarations des variables*/
  20. int i,findico;
  21. char reponse;
  22. /*Déclarations des pointeurs*/
  23. char **dico;
  24. char *mot_texte;
  25. /*Allocation des pointeurs */
  26. mot_texte=malloc(MAXMOTS*sizeof(char *));
  27. dico=malloc(MAXMOTS*sizeof(char *));
  28. if (mot_texte==NULL)
  29.   {
  30.    fprintf(stderr,"Allocation impossible \n" );
  31.    exit(EXIT_FAILURE);
  32.   }
  33. /*Vérification du nombre d'arguments corrects à l'appel*/
  34. if (argc!=2)
  35.   {
  36.    printf("Erreur dans le nombre d'arguments\n" );
  37.    exit(EXIT_FAILURE);
  38.   }
  39. /*Ouverture des fichiers en lecture*/
  40. fichiertexte=fopen(argv[1],"r" );
  41. if (fichiertexte==NULL)
  42.   {
  43.    printf("Impossible d'ouvrir %s.\n", argv[1]);
  44.    exit(EXIT_FAILURE);
  45.   }
  46. fichierdico=fopen("dico.dat","r" );
  47. if (fichierdico==NULL)
  48.   {
  49.    printf("Impossible d'ouvrir le fichier dico.dat\n" );
  50.    exit(EXIT_FAILURE);
  51.   }
  52. /*Lecture du fichier dico et stockage en mémoire dans le tabeau dico*/
  53. for(i=0;i<MAXMOTS;i++)
  54.   {
  55.    dico[i]=malloc(LONGMOT*sizeof(char));
  56.     if (dico[i]==NULL)
  57.     {
  58.      fprintf(stderr,"Allocation impossible \n" );
  59.      exit(EXIT_FAILURE);
  60.     }
  61.   }
  62. for(findico=0;!feof(fichierdico);findico++) fscanf(fichierdico,"%s",dico[findico]);
  63. nbmots=findico-1;
  64. /*Fermeture du fichier dico.dat*/
  65. fclose(fichierdico);
  66. /*Tri du tableau dico*/
  67. qsort(dico,nbmots,sizeof *dico,compare_mots);
  68. /*Lecture et traitement du fichier texte*/
  69. while(!feof(fichiertexte))
  70. {
  71.   fscanf(fichiertexte,"%s",mot_texte);
  72.   mot_texte=sup_ponc(mot_texte);
  73.   mot_texte=sup_maj(mot_texte);
  74.   if (dichotomie(dico,mot_texte)==0)
  75.    {
  76.     printf("Le mot '%s' n'est pas dans le dictionnaire, voulez vous le rajouter (o/n) ?\n", mot_texte);
  77.     reponse=getchar();
  78.     purger();
  79.     while((reponse!='o') && (reponse!='n'))
  80.      {
  81.       printf("Réponse invalide, recommencez\n" );
  82.       reponse=getchar();
  83.       purger();
  84.      }
  85.     if(reponse=='o')
  86.      {
  87.       ajout(dico,mot_texte);
  88.       /*Ouverture du fichier dico, écriture des éléments du tableau et fermeture*/
  89.       fichierdico=fopen("dico.dat","w" );
  90.       for(i=0;i<nbmots-1;i++) fprintf(fichierdico,"%s ",dico[i]);
  91.       fprintf(fichierdico,"%s",dico[nbmots-1]);
  92.       fclose(fichierdico);
  93.      }
  94.    }
  95.   }
  96. /*Fermeture du fichier texte*/
  97. fclose(fichiertexte);
  98. /*Libération des pointeurs en mémoire*/
  99. free(mot_texte);
  100. for (i=0;i<findico;i++) free(dico[i]);
  101. return 0;
  102. }
  103. char *sup_ponc(char *mot)
  104. {
  105.   int lettre, lettresuiv;
  106.   for(lettre=0, lettresuiv=0;mot[lettresuiv];lettre++)
  107.    {
  108.     lettresuiv=lettre+1;
  109.     /* Si le caractère est une ponctuation, on l'ignore*/
  110.     if (ispunct(mot[lettre])!=0) strcpy(&mot[lettre],&mot[lettresuiv]);
  111.    }
  112.   /*Pour terminer la chaîne:*/
  113.   mot[lettre]='\0';
  114.   return mot;
  115. }
  116. char *sup_maj(char *mot)
  117. {
  118.   int lettre;
  119.   for (lettre=0;mot[lettre];lettre++)
  120.    {
  121.     if (isupper(mot[lettre])) mot[lettre]=tolower(mot[lettre]);
  122.    }
  123.   return mot;
  124. }
  125. short dichotomie(char **dico,char *mot)
  126. {
  127. int i,j,k;
  128. j=nbmots;
  129. i=0;
  130. while ((j-i)>1)
  131.   {
  132.    k=i+((j-i)/2);
  133.    if (((j-i)%2)==0) k++;
  134.    if (strcmp(mot,dico[k-1])==0) return 1;
  135.    if (strcmp(mot,dico[k-1])<0) j=(k-1);
  136.    else i=(k-1);
  137.   }
  138. if ((strcmp(dico[i],mot)==0) || (strcmp(dico[j],mot)==0)) return 1;
  139. else return 0;
  140. }
  141. void ajout(char **dico,char *mot_texte)
  142. {
  143.   /*Si le le nombre de mots est supérieur à MAXMOTS, on affiche une erreur sinon on ajoute le mot a la fin du              tableau*/
  144.    if(nbmots!=MAXMOTS)
  145.     {
  146.      nbmots++;
  147.      strcpy(dico[nbmots-1],mot_texte);
  148.     }
  149.    else
  150.     {
  151.      printf("Vous avez dépassé le nombre de mots maximal du dictionnaire" );
  152.      exit(EXIT_FAILURE);
  153.     }
  154.   /*On retri le tableau*/
  155.    qsort(dico,nbmots,sizeof *dico,compare_mots);
  156. }
  157. int compare_mots(const void *chaine1, const void *chaine2)
  158. {
  159. return strcmp(*(char**)chaine1,*(char**)chaine2);
  160. }
  161. void purger(void)
  162. {
  163.   int c;
  164.   while ((c=getchar()) != '\n' && c != EOF)
  165.   {}
  166. }


 
J'espere que quelqu'un pourra m'aider parce que la je vais pas tarder à péter un câble  :pt1cable:  :pt1cable:  :pt1cable:  
Merci d'avance


Message édité par jamsss le 16-12-2009 à 00:47:39
Reply

Marsh Posté le 16-12-2009 à 01:37:52    

Utilise un debugger et vérifie ta dichotomie  ;)  
 
En vrac:
berk les variables globales.
 
inutile de créer ton tableau dynamiquement si c'est pour lui donner la taille d'un #define
dico[MAXMOTS][LONGMOT]
revient au même dans ce cas.
 
malloc => free (il en manque un je crois)
 
fscanf fgets
 
...


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 16-12-2009 à 18:34:34    

Tout d'abord merci de ton aide, pour te répondre:
 
-La fonction dichotomie marche je l'ai deja testée et le debugger ne me dit rien puisque le programme reste planté sans erreur..
-berk les variables globales je suis d'accord avec toi , c'était juste pour faire un test et je l'ai laissé en fait...
-Pour le tableau dynamique c'est vrai, au départ je voulais le faire mais je l'ai enlevé pour éviter les sources d'erreur
-Ah oui c'est vrai il manque un free, je l'ai mis mais ça ne résout pas le problème malheureusement...

Reply

Marsh Posté le 16-12-2009 à 20:08:28    

moi j'ai passé un coup de debugger et arrivé au mot "est", la fonction dichotomie tourne en boucle infinie. Je n'ai pas cherché pourquoi.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 16-12-2009 à 20:08:28   

Reply

Marsh Posté le 16-12-2009 à 20:44:51    

oui c'est ce que je redoutais... en fait j'avais crée et testé cette fonction dichotomie avant le code complet et j'avais déja eu ce souci de boucle infinie mais j'avais rajouté cette ligne:
 
if (((j-i)%2)==0) k++;
 
Je croyais avoir résolu le problème puisque ça fonctionnait, apparement maintenant ça ne fonctionne plus

Reply

Marsh Posté le 16-12-2009 à 22:19:50    

bon en fait j'ai trouvé il se trouve que contrairement aux apparences i+((j-i)/2) n'est pas équivalent à (i+j)/2...........et que je suis un gros boulet  :bounce:  :bounce:  :bounce:  :bounce:  :ange:

Message cité 1 fois
Message édité par jamsss le 16-12-2009 à 23:08:43
Reply

Marsh Posté le 16-12-2009 à 23:31:38    

jamsss a écrit :

bon en fait j'ai trouvé il se trouve que contrairement aux apparences i+((j-i)/2) n'est pas équivalent à (i+j)/2


Vive les entiers...

jamsss a écrit :

...........et que je suis un gros boulet  :bounce:  :bounce:  :bounce:  :bounce:  :ange:

Rassure toi, c'est souvent sur les erreurs les plus stupides que l'on passe le plus de temps...


---------------
deluser --remove-home ptitchep
Reply

Sujets relatifs:

Leave a Replay

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