Soyez le premier à donner votre avis sur cette source.
Vue 13 805 fois - Téléchargée 581 fois
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "stdbi.h" #include "lex.yy.c" extern char lexeme[]; extern int valeur; typedef struct { //Structure du dictionnaire char* mot; int occ; }sdico; typedef struct { //Structure du texte char *mot; int *nombre; int type; //0 : mot dans le dico, 1 : pas dans le dico, 2 : entier } stexte; void lexeme_minuscule() //Convertit lexeme en minuscule { int taille, i; taille=strlen(lexeme); for(i=0;i<taille;i++) lexeme[i]=tolower(lexeme[i]); return; } /*int present(sdico *dico, int taille) //Renvoie si lexeme est présent dans le dico { int i; for(i=0;i<taille;i++) { if(strcmp(dico[i].mot,lexeme) == 0) return i; } return 0; }*/ int present(sdico *dico, int inf, int sup) //Fonction dichotomique { int milieu; if (sup<inf) return -1; milieu = ((inf + sup)/2); if ( strcmp(lexeme, dico[milieu].mot) == 0 ) return milieu; if ( strcmp(lexeme, dico[milieu].mot) < 0 ) return(present(dico, inf, milieu-1)); return(present(dico, milieu+1, sup)); } int main(int argc, char** argv) { /*VARIABLES*/ int uc, i=0, tdico=0, ttexte=0, taille, temp; /*STRUCTURES*/ sdico *dico; stexte *texte; dico=malloc(1*sizeof(sdico)); texte=malloc(1*sizeof(stexte)); /*TEST DES ARGUMENTS*/ if(argc<=1) { fprintf(stderr, "absence de fichier source\n"); exit(1); } //Test du fichier source /*REDIRECTION DE L'ENTREE YYIN DANS LE DICTIONNAIRE*/ yyin=fopen("dico.dic","r"); /*STOCKAGE DU DICTIONNAIRE DANS LA STRUCTURE DICO*/ uc=yylex(); while(uc!=0) { if(uc==NOMBRE) printf("%d : NOMBRE\n", valeur); else if(uc==MOT) { taille=strlen(lexeme)+1; dico=realloc(dico,++i*sizeof(sdico)); dico[i-1].mot=malloc(sizeof(char)*taille); strcpy(dico[i-1].mot, lexeme); } uc=yylex(); } tdico=i; /*REDIRECTION DE L'ENTREE YYIN DANS LE DICTIONNAIRE*/ if( (yyin=fopen(argv[1],"r")) == 0 ) { fprintf(stderr, "fichier source inexistant\n"); exit(1); } /*STOCKAGE DU TEXTE DANS LA STRUCTURE TEXTE*/ uc=yylex(); while(uc!=0) { if(uc==MOT) { texte=realloc(texte,++ttexte*sizeof(stexte)); lexeme_minuscule(); //Transforme lexeme en minuscule texte[ttexte-1].mot=malloc( strlen(lexeme)+1 * sizeof(char) ); if( (temp=present(dico, 0, tdico)) != 0 ) //Si lexeme est un mot connu texte[ttexte-1].type=0; else //Si lexeme n'est pas un mot connu texte[ttexte-1].type=1; strcpy(texte[ttexte-1].mot, lexeme); //puts(lexeme); } else if(uc==NOMBRE) { texte=realloc(texte,++ttexte*sizeof(stexte)); texte[ttexte-1].nombre=malloc(sizeof(int)); texte[ttexte-1].nombre[0]=valeur; texte[ttexte-1].type=2; } uc=yylex(); } /*AFFICHAGE*/ for(i=0;i<ttexte;i++) { printf("%d : ",i); if(texte[i].type == 2) printf("%d : %d\n", texte[i].nombre[0], texte[i].type); else printf("%s : %d\n", texte[i].mot, texte[i].type); } /*LIBERATION DE LA MEMOIRE*/ free(dico); free(texte); return 0; }
17 févr. 2008 à 14:11
Sinon, je trouve qu'il y a encore plus de malloc de que free, bizarre...
Dans ta fonction present:
Au lieu d'évaluer 2 fois strcmp(lexeme, dico[milieu].mot), il faudrait le faire 1 fois et mettre le résultat dans une variable locale.
Ton système d'allocation à base de realloc me semble bien peu optimisé (à chaque nouveau mot tu fais une réallocation).
En C++, avec des map<string>, on peut faire la même chose, en plus optimisé et plus simple à comprendre.
17 févr. 2008 à 13:48
17 févr. 2008 à 11:22
Essaie de rester un peu plus cordial à l'avenir.
17 févr. 2008 à 11:10
Ensuite si tu avais jeté un coup d'oeil tu comprendrais que le fichier lex.yy.c je ne vais l'inclure qu'une seule fois et c'est tout
17 févr. 2008 à 02:00
j'ai jamais dit que c'étais pas possible mais pas suggéré .
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.