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

  FORUM HardWare.fr
  Programmation
  C

  [c] erreur de segmentation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[c] erreur de segmentation

n°1946725
jamsss
Posté le 02-12-2009 à 19:07:01  profilanswer
 

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
mood
Publicité
Posté le 02-12-2009 à 19:07:01  profilanswer
 

n°1946734
ptitchep
Posté le 02-12-2009 à 20:09:37  profilanswer
 

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
n°1949640
jamsss
Posté le 11-12-2009 à 19:04:25  profilanswer
 

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
n°1949733
jamsss
Posté le 12-12-2009 à 11:50:50  profilanswer
 

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

n°1949752
Trap D
Posté le 12-12-2009 à 14:58:29  profilanswer
 

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

n°1949889
jamsss
Posté le 13-12-2009 à 18:39:45  profilanswer
 

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

n°1950680
jamsss
Posté le 16-12-2009 à 00:12:27  profilanswer
 

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
n°1950684
ptitchep
Posté le 16-12-2009 à 01:37:52  profilanswer
 

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
n°1950997
jamsss
Posté le 16-12-2009 à 18:34:34  profilanswer
 

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...

n°1951007
ptitchep
Posté le 16-12-2009 à 20:08:28  profilanswer
 

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
mood
Publicité
Posté le 16-12-2009 à 20:08:28  profilanswer
 

n°1951010
jamsss
Posté le 16-12-2009 à 20:44:51  profilanswer
 

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

n°1951025
jamsss
Posté le 16-12-2009 à 22:19:50  profilanswer
 

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
n°1951032
ptitchep
Posté le 16-12-2009 à 23:31:38  profilanswer
 

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

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

  [c] erreur de segmentation

 

Sujets relatifs
[résolu][C] Strlen - erreur de segmentation[ C ] Erreur de segmentation (core dumped)
Courbes avec Qwt (erreur de segmentation)Erreur de segmentation avec un main vide
Ou est l'erreur de segmentation ?Erreur de Segmentation
Erreur de segmentation incompréhensibleerreur de segmentation
"erreur de segmentation" avec les threads sous linux en C++Erreur de segmentation
Plus de sujets relatifs à : [c] erreur de segmentation


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