Probleme avec tableau de chaines...

Probleme avec tableau de chaines... - C++ - Programmation

Marsh Posté le 31-03-2005 à 12:30:30    

Bonjour,
Voila j'ai le probleme suivant :
dans la procedure suivante je fais tout d'abord une premiere trace pour afficher in[i] puis la vient la boucle qui fait appel à la fonction CreeOuModifieLiens qui ne modifie pas ses paramètres et la j'essaye de refaire la meme trace que precedemment mais ca me fait une segmentation fault ! J'ai regardé le i garde la meme valeur donc je me demandais comment c'etait possible que mon tableau soit effacé quand je fais appel à ma seconde fonction ?!
 

Code :
  1. void lectureFenetre(char *in[],int taille)
  2. {
  3.    ...
  4.    printf("1 : %s,%d\n",in[i],i);////////////////////////
  5.    for(int j=i-tailleNec;j<i+tailleNec+1;j++)
  6.        if(i!=j) tabDeP[j]=CreeOuModifieLiens(in[i],in[j]); 
  7.    printf("2 : %s,%d\n",in[i],i);////////////////////////
  8.    ...
  9. }
  10. int main(int argc, char *argv[])
  11. {
  12.     char *out[MAX_TAILLE_PARAGRAPHE];
  13.     ...
  14.     lectureFenetre(out,n);
  15. }


 
J'ai oublie de preciser que cela n'arrivait que lorsque i atteignait la valeur 10 (avant ca marche parfaitement )


Message édité par Kineas le 31-03-2005 à 17:16:36
Reply

Marsh Posté le 31-03-2005 à 12:30:30   

Reply

Marsh Posté le 31-03-2005 à 12:36:47    

Ca sent le jardinage mémoire ... tes chaînes in[i] (en l'occurrence pour ton cas, les chaînes out[]) sont-elles correctement allouées ?

Reply

Marsh Posté le 31-03-2005 à 12:40:02    

En fait avant de faire appel a lectureFenetre j'affiche tous les elements contenus dans out et il n'y a aucun probleme donc je pense que mon tableau est correctement alloué !
 
Est-ce que ca serait possible que en faisant des new pour mes pointeurs dans CreeOuModifieLiens j'ecrive à l'emplacement que j'avais reserve pour mes chaines ?


Message édité par Kineas le 31-03-2005 à 12:45:05
Reply

Marsh Posté le 31-03-2005 à 12:48:53    

Kineas a écrit :

En fait avant de faire appel a lectureFenetre j'affiche tous les elements contenus dans out et il n'y a aucun probleme donc je pense que mon tableau est correctement alloué !


Ca ne prouve pas que ton tableau est correctement alloué. Si tu as écrit sur une zone non allouée préalablement, elle pourra être écrasée n'importe quand.

Reply

Marsh Posté le 31-03-2005 à 12:55:34    

Ben j'ai regarde mais il ne me semble pas avoir fait d'erreurs lors de mon allocation.
En fait je crée mon tableau a partir d'un fichier texte de la facon suivante :  
 

Code :
  1. int transParagraphe(FILE *file,char * out[])
  2. {
  3.     char motLu[27];
  4.     char ch;        // caractère lu
  5.     int j;          // indice pour l'ecriture du mot lu
  6.     int ind=0;      // indice pour ecrire dans le tableau out
  7.     int arret=0;    // booleen qui est a vrai si on a atteint une fin de paragraphe
  8.     int tiretTrouve=0;  //booleen vrai si on trouve un tiret après un mot que l'on vient de lire
  9.     int apostropheTrouve=0;  //booleen vrai si on trouve une apostrophe après un mot que l'on vient de lire
  10.     char motAvantTiret[27];
  11.     char motAvantApostrophe[27];
  12.     char motConstruit[27];
  13.    
  14.     fread(&ch, 1, 1, file);
  15.     while(!feof(file) && !arret)        //tant qu'on a pas atteint la fin du paragraphe
  16.     {
  17.         //on reconstruit le mot et on le range dans motLu
  18.         j=0;
  19.         while(ch>='a' && ch<='z' || ch>='A' && ch<='Z' || ch=='é' || ch=='è' || ch=='ê' || ch=='ë' || ch=='à' || ch=='î' || ch=='ï' || ch=='ù')
  20.         {
  21.             if(ch>='A' && ch<='Z')
  22.                 ch=tolower(ch);
  23.             motLu[j++]=ch;
  24.             fread(&ch, 1, 1, file);
  25.         }
  26.         motLu[j]='\0';
  27.            
  28.         //on regarde maintenant si le mot est correct et s'il peut etre ajouter à out sinon on passe au mot suivant
  29.         if(motCorrect(motLu))
  30.         {
  31.             if(tiretTrouve==1)  //il y avait un mot coorect suivi d'un tiret lors de la boucle precedente
  32.             {
  33.                 reconstruitMot(motAvantTiret,motLu,'-',motConstruit);
  34.                 out[ind]=(char *)malloc(sizeof(char[27]));
  35.                 strcpy(out[ind++],motConstruit);
  36.                 tiretTrouve=0;
  37.             }
  38.             else if(apostropheTrouve==1)  //il y avait un mot correct suivi d'une apostrophe lors de la boucle precedente
  39.             {
  40.                 reconstruitMot(motAvantApostrophe,motLu,'\'',motConstruit);
  41.                 out[ind]=(char *)malloc(sizeof(char[27]));
  42.                 strcpy(out[ind++],motConstruit);
  43.                 apostropheTrouve=0;
  44.             }
  45.             else
  46.             {       
  47.                 if(ch=='-')
  48.                 {
  49.                     strcpy(motAvantTiret,motLu);
  50.                     tiretTrouve=1;
  51.                 }
  52.                 else if(ch=='\'')
  53.                 {
  54.                     strcpy(motAvantApostrophe,motLu);
  55.                     apostropheTrouve=1;
  56.                 }
  57.                 else
  58.                 {
  59.                     out[ind]=(char *)malloc(sizeof(char[27]));
  60.                     strcpy(out[ind++],motLu);
  61.                 }
  62.             }
  63.         }
  64.         else
  65.         {
  66.             if(tiretTrouve==1)  //il y avait un mot coorect suivi d'un tiret lors de la boucle precedente
  67.             {
  68.                 out[ind]=(char *)malloc(sizeof(char[27]));
  69.                 strcpy(out[ind++],motAvantTiret);
  70.                 tiretTrouve=0;
  71.             }
  72.             else if(apostropheTrouve==1)  //il y avait un mot correct suivi d'une apostrophe lors de la boucle precedente
  73.             {
  74.                 out[ind]=(char *)malloc(sizeof(char[27]));
  75.                 strcpy(out[ind++],motAvantApostrophe);
  76.                 apostropheTrouve=0;
  77.             }
  78.         }
  79.        
  80.         //pour passer au mot suivant on se place au début du mot suivant
  81.         while(!feof(file) && (ch!='\n') && (ch<'a' || ch>'z') && (ch<'A' || ch>'Z') && ch!='é' && ch!='è' && ch!='ê' && ch!='ë' && ch!='à' && ch!='î' && ch!='ï' && ch!='ù')
  82.             fread(&ch, 1, 1, file);
  83.         //si on trouve le caractère "return" on passe au caractère suivant
  84.         if(ch=='\n')
  85.         {
  86.             fread(&ch, 1, 1, file);
  87.             if(ch=='\n')        //si il y a un second "return" c'est qu'on a atteint la fin du paragraphe
  88.                 arret=1;
  89.         }
  90.     }
  91.     return ind;               
  92. }


 
Désolé le code est un peu long...

Reply

Marsh Posté le 31-03-2005 à 14:48:00    

Kineas a écrit :

Ben j'ai regarde mais il ne me semble pas avoir fait d'erreurs lors de mon allocation.
En fait je crée mon tableau a partir d'un fichier texte de la facon suivante :  
 
<...>


  • Plusieurs fonctions ne sont pas définies. :  

int motCorrect(char const *motLu);
int reconstruitMot(char const *motAvantTiret,char const *motLu, int sep,char *motConstruit);

  • feof() ne fait pas ce que tu crois
  • 'fread (&ch, 1, 1, file);' est une forme compliquée de 'ch = fgetc(file);'

http://mapage.noos.fr/emdel/notes.htm#fichiers

  • On a pas d'exemple de fichier à traiter...
  • il existe les fonctions isalpha(), strchr()... qui évitent ces if() et || à répétition...
  • 'malloc (sizeof (char[27])' est une forme complique de 'malloc (27)'
  • malloc() n'a pas besoin de cast, par contre il faut un prototype (<stdlib.h> ) et un test, car il peut echouer.

http://mapage.noos.fr/emdel/notes.htm#malloc
etc.


---------------
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 31-03-2005 à 16:26:12    

Ok merci pour tout ces details mais en fait etant donner que je ne trouvais pas la solution j'ai decide de tout passer mon programme avec des string et des vector (acr en fait a la base je voulais faire du c++...)
Sinon une question quand meme sur ce que tu m'as dit Emmanuel : que fait feof() ?? parce que la je suis passe aux fgetc et donc au '!=EOF' mais j'aurai quand meme besoin a un moment d'appeler feof() (car dans la boucle je fais appel seulemtn a des procedures qui elles lisent les caracteres et donc je ne peux pas faire un '!=EOF' !)

Reply

Marsh Posté le 31-03-2005 à 17:04:16    

Kineas a écrit :

que fait feof() ??


feof() sert uniquement à préciser la cause de l'arrêt de la lecture après que la fin de lecture ai été detectée (retour de EOF, par exemple). Ca n'a qu'un intérêt limité...
 
http://mapage.noos.fr/emdel/notes.htm#fichiers (déjà signalé. Est-ce la peine que je me décarcasse si tu ne lis pas les liens fournis ?)

Citation :

parce que la je suis passe aux fgetc et donc au '!=EOF' mais j'aurai quand meme besoin a un moment d'appeler feof() (car dans la boucle je fais appel seulemtn a des procedures qui elles lisent les caracteres et donc je ne peux pas faire un '!=EOF' !)


Je ne vois pas trop où est le problème. Ce code est 'canonique'...


   int c;
 
   while ((c = fgetc (fp)) != EOF)
   {
      /* traiter c */
   }


Message édité par Emmanuel Delahaye le 31-03-2005 à 17:05:37

---------------
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 31-03-2005 à 17:09:35    

Ok j'ai compris pour ce qui est des fichiers !  
Par contre je viens de finir de transformer mon code en vrai code c++ (enfin je pense...) et j'ai toujours la meme erreur !
Par contre je pense avoir trouver d'ou elle vient mais je ne sais pas pourquoi je l'ai !  
Mon code est le suivant maintenant :  

Code :
  1. void lectureFenetre(vector<string> paragraphe)
  2. {
  3.     vector<string> tabTemp;
  4.     int taille=paragraphe.size();
  5.     float tabDeP[WINDOWS_SIZE];
  6.     int ind;
  7.     for(int i=0;i<taille;i++)
  8.     {
  9.         tabTemp.clear();
  10.         if(i<tailleNec)     //cas de debut de paragraphe
  11.         {... }
  12.         else if((i+tailleNec)>=taille)      //cas de fin de paragraphe
  13.         {... }
  14.         else
  15.         { 
  16.             cout << i+tailleNec <<"," << taille << endl; //DEBUG pour taille
  17.             //on ajoute a chaque pas le dernier mot dans le tableau (seul mot que l'on a pas encore lu)
  18.             ajouterMotTableau(paragraphe[i+tailleNec]);     //<= erreur ici i+tailleNec==taille normalement quand i=10
  19.             //Direct co-occurrence effect               
  20.             //cout << i << ":" << paragraphe[i] << endl;
  21.             for(int j=i-tailleNec;j<i+tailleNec+1;j++)
  22.                 if(i!=j)    tabDeP[j]=CreeOuModifieLiens(paragraphe[i],paragraphe[j]); 
  23.             //cout << i << "," << paragraphe[i] << endl;
  24.             for(int j=i-tailleNec;j<i+tailleNec+1;j++)
  25.             {
  26.                 if(i!=j)
  27.                 {
  28.                     //Second order co-occurrence effect
  29.                     CreeOuModifieLiensVoisins(paragraphe[i],paragraphe[j],tabDeP[j]);
  30.                     //on ajoute l'élément lu dans temp pour la reduction de liens (juste au dessous)
  31.                     tabTemp.push_back(paragraphe[j]);
  32.                 }
  33.             }
  34.             //Occurence without a co-occurrence effect
  35.             ReduitLiens(paragraphe[i],tabTemp);
  36.         }
  37.     }
  38. }


et le probleme arrive toujours lors de la 11 eme boucle (i=10) mais en fait il est cause tout simplement par la variable taille (qui passe dans mon exemple qui plante de 12 lorsque i vaut 9 à 1056964608 lors de l'iteration suivante!! Et la j'avoue que je suis bluffé !!) :bounce:
 
(la segmentation fault vient du fait que dans mon ex le programme doit rentrer 2 fois dans le if, 8 fois dans le else et puis 2 fois dans le else if mais il rentre une fois de trops dans le else...)


Message édité par Kineas le 31-03-2005 à 17:12:22
Reply

Marsh Posté le 31-03-2005 à 17:16:07    

Kineas a écrit :

Ok j'ai compris pour ce qui est des fichiers !  
Par contre je viens de finir de transformer mon code en vrai code c++ (enfin je pense...)


Mauvais forum. C et C++ sont deux langages différents. Donc, 2 forums differents.
 
Change la balise de [C] en [C++]
 
 
 


---------------
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 31-03-2005 à 17:16:07   

Reply

Marsh Posté le 01-04-2005 à 10:08:01    

Kineas, passe un pointeur à ta fonction.

Reply

Sujets relatifs:

Leave a Replay

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