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

  FORUM HardWare.fr
  Programmation
  C++

  Probleme avec tableau de chaines...

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme avec tableau de chaines...

n°1030920
Kineas
Posté le 31-03-2005 à 12:30:30  profilanswer
 

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
mood
Publicité
Posté le 31-03-2005 à 12:30:30  profilanswer
 

n°1030923
dsls
Posté le 31-03-2005 à 12:36:47  profilanswer
 

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 ?

n°1030928
Kineas
Posté le 31-03-2005 à 12:40:02  profilanswer
 

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
n°1030936
dsls
Posté le 31-03-2005 à 12:48:53  profilanswer
 

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.

n°1030941
Kineas
Posté le 31-03-2005 à 12:55:34  profilanswer
 

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

n°1031146
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-03-2005 à 14:48:00  profilanswer
 

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/
n°1031380
Kineas
Posté le 31-03-2005 à 16:26:12  profilanswer
 

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' !)

n°1031470
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-03-2005 à 17:04:16  profilanswer
 

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/
n°1031479
Kineas
Posté le 31-03-2005 à 17:09:35  profilanswer
 

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
n°1031490
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-03-2005 à 17:16:07  profilanswer
 

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/
mood
Publicité
Posté le 31-03-2005 à 17:16:07  profilanswer
 

n°1032157
el muchach​o
Comfortably Numb
Posté le 01-04-2005 à 10:08:01  profilanswer
 

Kineas, passe un pointeur à ta fonction.


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

  Probleme avec tableau de chaines...

 

Sujets relatifs
Problème requête : Chaines de caractèresprobleme avec chaine contenant des "+"
textbox et format des chiffres saisi dedans = probleme !![Resolu] Probleme Sql mais comment ?
probleme avec un menu flashAfficher des données en 2 collones via un tableau
problème test db[sessions et easyphp 1.7] probleme page à page
probleme internet explorer 
Plus de sujets relatifs à : Probleme avec tableau de chaines...


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