Passage erroné d'un tableau de chaînes de caractères à une procédure..

Passage erroné d'un tableau de chaînes de caractères à une procédure.. - C++ - Programmation

Marsh Posté le 09-03-2003 à 23:22:27    

voilà, j'ai fait un programme qui charge des fichiers de deux façons différentes (un index.txt chargé par ligne dans un tableau de tableaus de char (char**) et un fichier test.tex chargé dans un tableau de char (char*)).
 
dans le module de chargement, je lis sans problèmes sourcev[i] mais dans main.c j'ai une erreur de segmentation pour les mêmes i (tous). voici le code :
 
fichier texindex.c

Code :
  1. #include "texindex.h"
  2. void readIndexTxt(char* filename, int* indexc, char** indexv, Boolean verbose)
  3. {
  4.   int i=0;
  5.   FILE* f;
  6.   //tampon de lecture
  7.   char s[40];
  8.  
  9.   if((f=fopen(filename,"r" ))==NULL)
  10.     {
  11.       printf("Erreur d'ouverture du fichier %s\n",filename);
  12.       exit(1);
  13.     }
  14.   //comptage des mots contenus dans le fichiers (un par ligne)
  15.   (*indexc)=0;
  16.   while((fgets(s,80,f))!=NULL) (*indexc)++; //ajout d'un mot
  17.   //allocation mémoire
  18.   indexv=malloc((*indexc)*sizeof(char[40]));
  19.   //retour au début du fichier
  20.   rewind(f);
  21.   //remplissage de la liste de mots
  22.   printf("Chargement de la liste de mots" );
  23.   if(verbose) printf("\n" );
  24.   while((fgets(s,80,f))!=NULL)
  25.     {
  26.      indexv[i]=s;
  27.      if(verbose) printf("Chargement de : indexv[%d]\t:\t%s",i,indexv[i]);
  28.      else printf("." );
  29.      i++;
  30.     }
  31.  
  32.   fclose(f);
  33. }
  34. void readSourceTeX(char* filename, int* sourcec, char* sourcev, Boolean verbose)
  35. {
  36.   int i=0;
  37.   FILE* f;
  38.   //tampon de lecture
  39.   char c;
  40.   if((f=fopen(filename,"r" ))==NULL)
  41.    {
  42.      printf("\nErreur d'ouverture du fichier %s\n",filename);
  43.      exit(1);
  44.    }
  45.   //chargement du fichier
  46.   printf("\nChargement de la source non indexée" );
  47.   //comptage du nombre de caractères
  48.   (*sourcec)=0;
  49.   while((c=getc(f))!=EOF) (*sourcec)++; //ajout d'un caractère
  50.   //allocation mémoire
  51.   sourcev=malloc((*sourcec)*sizeof(char));
  52.   //retour au début du fichier
  53.   rewind(f);
  54.   //chargement en mémoire du fichier
  55.   printf("\nChargement du fichier source" );
  56.   while((c=getc(f))!=EOF)
  57.     {
  58.       sourcev[i]=c;
  59.       if(verbose) printf("Chargement de : sourcev[%d]\t:\t%c\n",i,sourcev[i]);
  60.       else printf("." );
  61.       i++;
  62.     }
  63.   fclose(f);
  64. }


 
fichier principal : main.c

Code :
  1. #include<string.h>
  2. #include "texindex.h"
  3. #include "boolean.h"
  4. int main(int argc, char** argv)
  5. {
  6.   int i,j;
  7.   //options en vrac
  8.   char* optionlist=NULL;  //chaine des options
  9.   char optionbuffer='-'; //utile pour extraire les options
  10.   //options bien découpées...
  11.   int optc=0; //nombre d'options
  12.   char* optv; //liste des options
  13.   //liste des options possibles :
  14.   Boolean opt_v=FAUX;  //mode verbose
  15.   Boolean opt_c=FAUX;  //mode copie
  16.   //fichiers source, index et copie
  17.   char* fsource=""; //fichier source TeX
  18.   char* findex="";  //fichier index Txt
  19.   char* fcopie="";  //fichier copie TeX si besoin
  20.   //tableau des mots à indexer :
  21.   int indexc=0;
  22.   char** indexv;
  23.   //fichier source :
  24.   int sourcec=0; //nombre de caractères
  25.   char* sourcev; //ligne de caractères
  26.  
  27.   switch(argc)
  28.     {
  29.     case 0:
  30.     case 1:
  31.     case 2:
  32.       printf("Erreur, nombre d'arguments incorrect !\nmakeindex [-vc] source.tex index.txt [copie.tex]\n" );
  33.       return EXIT_FAILURE;
  34.       break;
  35.     case 3:
  36.       printf("3\n" );
  37.       //normalement pas d'options...
  38.       //tester l'existence des fichiers en argument
  39.       fsource=argv[1];
  40.       findex=argv[2];
  41.       break;
  42.     case 4:
  43.       printf("4\n" );
  44.       //normalement, une option et pas de copie
  45.       optionlist=argv[1];
  46.       fsource=argv[2];
  47.       findex=argv[3];
  48.       break;
  49.     case 5:
  50.       //normalement, une option dont c et il y a un fichier copie
  51.       optionlist=argv[1];
  52.       fsource=argv[2];
  53.       findex=argv[3];
  54.       fcopie=argv[4];
  55.       break;
  56.     default:
  57.       printf("Erreur, nombre d'arguments incorrect !\nmakeindex [-vc] source.tex index.txt [copie.tex]\n" );
  58.       return EXIT_FAILURE;
  59.       break;
  60.     }
  61.   //vérification du - d'options s'il y a des options :
  62.   if(optionlist!=NULL)
  63.     {
  64.       optionbuffer=optionlist[0];
  65.       //découpage des options et allocation mémoire :
  66.       optc=strlen(optionlist)-1;
  67.       optv=malloc(sizeof(char));
  68.     }  
  69.  
  70.   if(optionbuffer!='-')
  71.     {
  72.       printf("Erreur de syntaxe !\nmakeindex [-vc] source.tex index.txt [copie.tex]\n" );
  73.       return EXIT_FAILURE;
  74.     }
  75.   printf("nb args\t:\t%d\n",optc);
  76.   for(i=0;i<optc;i++)
  77.     {
  78.       j=i+1;
  79.       optionbuffer=optionlist[j];
  80.       optv[i]=optionbuffer;
  81.       switch(optionbuffer)
  82.       {
  83. case 'c':
  84.           opt_c=VRAI;
  85.   break;
  86. case 'v':
  87.           opt_v=VRAI;
  88.           break;
  89. default:
  90.   printf("Erreur, option invalide [%c] !\nmakeindex [-vc] source.tex index.txt [copie.tex]\n",optionbuffer);
  91.   return EXIT_FAILURE;      
  92.       }
  93.       printf("option %d\t:\t%c\n",j,optv[i]);
  94.     }
  95.   printf("---\n" );
  96.   printf("fichier source\t:\t%s\nfichier index\t:\t%s\nfichier copie\t:\t%s\nliste d'options\t:\t%s\n",fsource,findex,fcopie,optionlist);
  97.  
  98.   //c'est parti !
  99.  
  100.   //lecture du fichier d'index de mots :
  101.   readIndexTxt(findex,&indexc,indexv,opt_v);
  102.  
  103.   printf("\nVérification :\n" );
  104.   for(i=0;i<indexc;i++)
  105.     {
  106.       printf("%s\n",indexv[i]);
  107.     }
  108.   printf("\n" );
  109.   return EXIT_SUCCESS;
  110.  
  111.   //lecture du fichier source .tex :
  112.   readSourceTeX(fsource,&sourcec,sourcev,opt_v);
  113.   printf("\nVérification :\n" );
  114.   for(i=0;i<sourcec;i++)
  115.     {
  116.       printf("%c",sourcev[i]);
  117.     }
  118.   printf("\n" );
  119.   return EXIT_SUCCESS;
  120. }


 
les erreurs ont lieu ici :
 
là ça marche :
  while((c=getc(f))!=EOF)
    {
      sourcev[i]=c;
      if(verbose) printf("Chargement de : sourcev[%d]\t:\t%c\n",i,sourcev[i]);
      else printf("." );
      i++;
    }
 
là ça plante :
  for(i=0;i<sourcec;i++)
    {
      printf("%c",sourcev[i]);
    }


Message édité par ceyquem le 16-03-2003 à 16:09:09
Reply

Marsh Posté le 09-03-2003 à 23:22:27   

Reply

Marsh Posté le 10-03-2003 à 07:17:29    

bon je corrige que le morceau de code qui est clairment présenté, à savoir le petit bout quie st à la fin. situe nous mieux le problème en enlevant tout ton foutoir (le traitement d'option apr ailleurs)
 
char c;
 
c doit etre un int, par ce que EOF ne rentre pas dans un char. tu risque donc de ne pas voir que tu es arrivé en fin de fichier

Reply

Marsh Posté le 10-03-2003 à 13:45:19    

optv=malloc(sizeof(char));  
 
Ton pb doit venir de cette ligne. Ici, tu n'alloues qu'un caractère !

Reply

Marsh Posté le 16-03-2003 à 16:07:57    

bon now j'ai un nouveau problème :
dans texindex.c :
j'alloue de la place à indexv  en fonction du nombre de mots dans le fichier d'index, puis je le remplis avec les mots :
 

Code :
  1. //comptage des mots contenus dans le fichiers (un par ligne)
  2.   (*indexc)=0;
  3.   while((fgets(s,80,f))!=NULL) (*indexc)++; //ajout d'un mot
  4.   //allocation mémoire
  5.   (*indexv)=malloc((*indexc)*sizeof(char[40]));
  6.   //retour au début du fichier
  7.   rewind(f);
  8.   //remplissage de la liste de mots
  9.   printf("Chargement de la liste de mots" );
  10.   if(verbose) printf("\n" );
  11.   while((fgets(s,80,f))!=NULL)
  12.     {
  13.      (*indexv)[i]=s;
  14.      if(verbose) printf("Chargement de : indexv[%d]\t:\t%s",i,(*indexv)[i]);
  15.      else printf("." );
  16.      i++;
  17.     }

 
 
tout s'affiche correctement...
 
par contre si je fais le même printf dans le main.c une fois cette procédure appelée, j'ai des (null) affichés à chaque fois :

Code :
  1. //lecture du fichier d'index de mots :
  2.   readIndexTxt(findex,&indexc,&indexv,opt_v);
  3.  
  4.   printf("\nVérification : %d\n",indexc);
  5.   for(i=0;i<indexc;i++)
  6.     {
  7.        printf("Vérification : indexv[%d]\t:\t%s",i,indexv[i]);
  8.     }
  9.   printf("\n" );


Message édité par ceyquem le 16-03-2003 à 16:08:25
Reply

Marsh Posté le 16-03-2003 à 20:56:24    

:bounce:

Reply

Marsh Posté le 16-03-2003 à 23:59:07    

void readIndexTxt(char* filename, int* indexc, char** indexv, Boolean verbose)
 
int indexc=0;
char** indexv;
 
readIndexTxt(findex,&indexc,&indexv,opt_v);
 
&indexv est un char***
 
(bizarre que le compilateur ne le signale pas)

Reply

Sujets relatifs:

Leave a Replay

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