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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°327910
ceyquem
E falso sequitur quodlibet
Posté le 09-03-2003 à 23:22:27  profilanswer
 

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
mood
Publicité
Posté le 09-03-2003 à 23:22:27  profilanswer
 

n°328013
Taz
bisounours-codeur
Posté le 10-03-2003 à 07:17:29  profilanswer
 

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

n°328222
pascal_
Posté le 10-03-2003 à 13:45:19  profilanswer
 

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

n°334473
ceyquem
E falso sequitur quodlibet
Posté le 16-03-2003 à 16:07:57  profilanswer
 

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
n°334656
ceyquem
E falso sequitur quodlibet
Posté le 16-03-2003 à 20:56:24  profilanswer
 

:bounce:

n°334782
Deaddy
Posté le 16-03-2003 à 23:59:07  profilanswer
 

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)


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

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

 

Sujets relatifs
[PHP] Trier un tableau associatif sur le champ de son choix ?partager une chaîne de caractères
Probleme de passage de variable en parametre (type=file)Recherche de chaine de caracteres...
(encore moi) comment differencier ces 2 chaines ???[HTML] un tableau w3c compliant c comment ??
envoyer un tableau dans une URLPhp/javascript : problème de passage de paramètre par URL
[PHP] Supprimer des espaces en fin de chaine de caracteres ?Changer valeur d'une clé d'un tableau associatif
Plus de sujets relatifs à : Passage erroné d'un tableau de chaînes de caractères à une procédure..


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