Allocation de tableaux de structures (malloc)

Fermé
k11 Messages postés 3 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 18 avril 2007 - 17 avril 2007 à 08:43
Stupeflip Messages postés 391 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 4 décembre 2007 - 18 avril 2007 à 11:13
Bonjour,

En fait j'ai un exercice qui consiste a balayer 9pages html,ki contiennent du lexique sous cette forme:

anglais
acronyme
japonais

et de l'afficher sous une forme tabulee
ex:

anglais acronyme japonais
anglais acronyme japonais
anglais acronyme japonais

etc...

le probleme est que j'arrive a compiler le code mais quand j'execute il ya erreur,donc j'ai pense que ce serait a cause de la memoire et j'ai ajoute cette ligne pour allouer le tableau de structure...mais sans espoir :<
je penses que je me suis trompe dans la syntaxe du malloc...

est-ce que quelquun pourrait me guider SVP.


voici le code
le fichier main.h contient la structure:


#include <stdio.h>
#include <stdlib.h>

   
  typedef struct field field;
  
  struct field
   {
        char Engl[100];
        char Acro[100];
        char Jp[100]; 
        char exp[100]; 
         };
         











        #include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include<string.h>
#include "main.h"


int main(int argc, char *argv[])

{
   char ACR[3]={97,34,62}; //code ascii for |  a">  
   char ENG1[3]={119,34,62};//code ascii for |  w">  |    .....< :english
   int CurrentChar;
   int Cursor_position=0;
   int i,j,k,f=0;
   int expr_nbr=100;
   field Field[expr_nbr];
   int *buffer=NULL;
   int CATEGORY[9]={67,65,84,69,71,79,82,89,91};// to detect the string"CATEGORY["
    char FileName[100];
  char CAT[100]; 
   
   
   for(i=0;i<100;i++)                {
   
   Field[i]=(malloc(sizeof(field));
                                     }
                                     
                                     
    FILE *TheFile=NULL;     //the readed file

    //to open the 9 files
    
    
          for(f=1;f<10;f++)         
          {//accolade pr faire ca pour les 9 fichiers
             sprintf(FileName,"%d.htm",f);
                     
    
  TheFile = fopen(FileName, "r");
  
  
      if(NULL==TheFile){
        printf("ERROR!This File does not exist!!\n\n");
                                                     
                                   return 1;}
     if (TheFile!= NULL)
       {  
       
        // scanning all the character of the text
                    
  
        do
        {
            CurrentChar = fgetc(TheFile );
 
 for(i=0;i<9;i++)
 
              {   
           if(CATEGORY[i]==CurrentChar)
           
                Cursor_position++; 
              }
  i=0;
 do{                             //fill the array category with the name of the category
      CAT[i]= CurrentChar;              
              i++;   } 
        while(CurrentChar=!60);     
  
  rewind(TheFile);//place the cursor to the beginning of the File
  //& continue scanning
  
  for(i=0;i<3;i++)
                  {
                    if(CurrentChar==ENG1[i])//when I found the string<span class="a"> I began 
                        //to move the cursor until the  english sentence 
                       { Cursor_position++;}
                        
                  }
                  k=0;
  do{

    Field[expr_nbr].Engl[k]=CurrentChar;//input english words in the english string
    k++; //move the index in the string to scan the next char
    }
  while(CurrentChar=!60) ;//then scan every char until "<"


 for(i=0;i<3;i++)
                 {
                   if(CurrentChar==ACR[i])
                   {Cursor_position++;}
                 }

                 if(ACR[i+1]==62)
                 {
                 
                 //if we don't have acronym:in this situation 
                //span class= "a">< input the japanese sentence
               
                 
    for(i=0;i<6;i++) {
        *buffer=CurrentChar;//to move the cursor of 6 until
                                         //the begining of jp sentence </span> 
                      }
    k=0;   
    do{   
    Field[expr_nbr].Jp[k]=CurrentChar;
    k++; 
                                                  }
      while(CurrentChar=!60)  ;
    buffer=NULL;//initialize the buffer again
                 }
                  
                
else {
     //input the ACRONYM and then input the japanese sentence

do
{
   k=0;      
    Field[expr_nbr].Acro[k]=CurrentChar;//input Acronym  in the ACRO string
    k++; //move the index in the string to scan the next char
 } while(CurrentChar=!60); //then scan every char until "<"

do{
    for(i=0;i<10;i++) 
    {
        *buffer=CurrentChar;// </span><br>   after these 10 char &stock               
    k=0;      
    Field[expr_nbr].Jp[k]=CurrentChar;
    k++;
    }
     }
    while(CurrentChar=!60); //japanese

}
buffer=NULL;
       }//fin du do
   while (CurrentChar != EOF);
  
   
          
  
       
  //display data as  tabulated  file
  for(i=0;i<expr_nbr;i++)
  
                         
printf("%s \n\n\n %s \t\t %s \t\t %s \t\t %s\n ",CAT,Field[expr_nbr].Engl,Field[expr_nbr].Acro,Field[expr_nbr].Jp,Field[expr_nbr].exp);          
                         
                         

  
    fclose(TheFile);
 }
//if open
}//9 files
  system("PAUSE");	
  return 0;

  
  
  }//accolade du main
  
  
 
                                     

3 réponses

Stupeflip Messages postés 391 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 4 décembre 2007 94
17 avril 2007 à 10:28
Salut,

Mets
 const  int expr_nbr=100;

dans ta déclaration au lieu d'un
 int expr_nbr=100;

Normalement ça sera déjà mieux.

Tiens moi au courant
0
k11 Messages postés 3 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 18 avril 2007
18 avril 2007 à 02:48
Stupeflip>
Merci pour ta reponse.mais en fait meme apres avoir mis le const devant ,ca change pas trop...

j'ai essaye d'imprimer pour voir ce qui se passe au niveau de la category:
ex:mon fichier HTML est de la sorte

|CATEGORY[ŒRŽ–¥–h‰q]</title>
</head>

et je ne veux prendre keskia apres le tableau
int CATEGORY[9]={67,65,84,69,71,79,82,89,91};// ce qui est le code ASCII de "CATEGORY["
et quand je vois un "<"//son code ASCII c'est 60//je m'arrete de rentrer les donnees dans mon tableau de CAT[i];



donc j 'Ai essaye d'Afficher a l'ecran pour voir skispasse:

do
{
CurrentChar = fgetc(TheFile );
{
// printf("%d\n",CurrentChar);
for(i=0;i<9;i++)

{ // printf("%d\n",Cursor_position);printf("%d\n",CurrentChar);
if(CATEGORY[i]==CurrentChar)

Cursor_position++;
}
i=0;
do{ //fill the array category with the name of the category
CAT[i]= (char)CurrentChar;

printf("%c\t",CAT[i]);
i++; }
while(CurrentChar=!60);

/////////////////////////////////////////////////////

mais il M'affiche pas seulement skiya ds category mais tous le fichier html depuis le debut,et a un certain moment ca plante(peut etre overflow)
donc le probleme est ds ma boucle je penses je fais fgetc de tous les char mais je veux prendre que certains char apres certaines string,mais je prends tous les char du fichier.....

tu aurais pas une idee..
0
Stupeflip Messages postés 391 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 4 décembre 2007 94
18 avril 2007 à 09:46
Si j'ai bien compris ton code, tu prends un caractère dans le fichier, tu le scan un coup pour voir si ça fait le bonne chaîne, et tu positionnes un curseur position au bon endroit dans le fichier ? (cursor_position pointe sur le fichier ?)

Seulement après, tu ne tiens plus compte de ce curseur, tu copies tout dans CAT[i] jusqu'à ton caractère '<' quoiqu'il arrive. En plus ça se brouille ici, tu copies currentchar dans le 2e do/while en incrémentant CAT[i], mais sans changer currentchar.

Enfin tu as une accolade ouvrante toute seule (ligne 4), peut-être n'as-tu pas mis tout ton code, et avec ce que je lis je ne peux pas t'aider plus voilà !

Bon courage
0
k11 Messages postés 3 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 18 avril 2007
18 avril 2007 à 10:06
Stupeflip>

en fait tu as raison j'ai passe la journee dessus pour conclure que c 'etait trop brouillon.

donc j'ai decide de prendre petit a petit,je me suis dit d'abord je fais une petit bout ki me rentre juste le vocabulaire anglais,
et dans la page Html il@est toujours compris entre

w"> ENGLISH <
donc j 'ai decide de balayer encore avec getchar et d'imprimer a chak fois tous ce qui est entre ces caracteres,le pb c 'est que je m'en sors pas non plus cette fois il ne plante plus,mais il m'affiche tous le fichir source Html [T_T]
HELP!

cette fois ca ressemble a ca:
int main(int argc, char *argv[])
{
  int i;  
  int CurrentChar;
  char CAT[100];
  int ENG1[3]={119,34,62};
  FILE *TheFile = fopen("1.htm", "r");
  
  
  
  
        if(NULL==TheFile){
           printf("ERROR!This File does not exist!!\n\n");
                                                     
                                   return 1;}
        if (TheFile!= NULL)
                  { 
                    do{
                  
                  CurrentChar = fgetc(TheFile );   
                        for(i=0;i<3;i++)
                  {
                    if(CurrentChar==ENG1[i])         //je compare avec mes 
                   {                                                         //3 caracteres    w"> 
                  
                    if(ENG1[2]==62)                          //si j'arrive a la derinere
                      {                                                      //case de mon tableau 
                       do{                                                //je veux imprimer
                                                                             //tous juskau caractere < 
                           printf("%c\n",(char)CurrentChar);    
                       
                         }while(CurrentChar!=60);                           }
                                                }      
                                                }        
                      } while(CurrentChar!=EOF); 
                       
                  fclose(TheFile);
                  }
  
  
  system("PAUSE");	
  return 0;
}

//////////////////////////////////////////////////////

je sais que ma boucle et mal faite ,et que avec le fgetc je prends paski est bon,mais j'arrive pas a l'arranger >_<
0
Stupeflip Messages postés 391 Date d'inscription jeudi 8 février 2007 Statut Membre Dernière intervention 4 décembre 2007 94
18 avril 2007 à 11:13
Le problème c'est que j'ai l'impression que ta condition
if(CurrentChar==ENG1[i])
ne sert à rien. Si c'est le premier ou le deuxième, bah c'est bloqué au if suivant, du coup ça reboucle comme si il n'y avait rien, tu as un donc un test unique sur le dernier caractère (le 3e).

Pourquoi ne fais-tu pas un fgets ainsi tu pourrais scanner une chaine de caractère ça serait plus simple non ?
0

Discussions similaires