IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Construction arbre lexicographique


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Par défaut Construction arbre lexicographique
    Bonjour à tous (toutes)!
    Dans le cadre d'un projet universitaire, je dois construire un lexique à partir d'un fichier texte.
    Il faut que je lise le fichier, que je créé un arbre lexicographique à l'aide du fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct noeud{
      unsigned char lettre;
      struct noeud *filsg, *frered;
    }Noeud, *Arbre;
     
    Arbre AlloueNoeud(char let){
      Arbre tmp;
      tmp = (Noeud*)malloc(sizeof(Noeud));
      if (tmp == NULL)
        return NULL;
      tmp->lettre = let;
      tmp->filsg = NULL;
      tmp->frered = NULL;
      return tmp;
    }
     
    int FileLen(char* file){
      FILE* fichier = NULL;
      int i=0;
      fichier = fopen(file, "r");
      if (fichier != NULL){
        while(fgetc(fichier) != EOF)
          i++;
      }
      fclose(fichier);
      return i;
    }
     
    /*La fonction suivante lit un fichier, et inscrit chaque caractère du fichier dans un tableau. Ce tableau sera utilisé pour la création de l'arbre.*/
     
    char* ReadFile(char tab[], char* file){
      FILE* fichier = NULL;
      int indice=0;
      fichier = fopen(file,"r");
      if (fichier != NULL){
        while((tab[indice] = fgetc(fichier))!=EOF)
          indice++;
      }
      fclose(fichier);
      return tab;
    }
     
    void Build(char caractere[], Arbre*a, int i){
      if(caractere[i] == EOF)
        exit(0);
      if(('A'<=caractere[i]<='Z')||('a'<=caractere[i]<='z')){
        if(a== NULL){
          Arbre New = AlloueNoeud(caractere[i]);
          *a = New;
          Build(caractere, &((*a)->filsg), i+1);
        }
     
        if(caractere[i] == (*a)->lettre)
          Build(caractere, &((*a)->filsg), i+1);
     
        else if(caractere[i]<(*a)->lettre){
          Arbre New = AlloueNoeud(caractere[i]);
          New->frered = (*a)->frered;
          (*a) = New;
          Build(caractere, &((*a)->filsg), i+1);
        }
     
        else if(caractere[i]>(*a)->lettre){
          Build(caractere, &((*a)->frered), i);
        }
      }
      else if(caractere[i] =='\0'){
        Arbre New = AlloueNoeud(caractere[i]);
        (*a)->filsg = New;
      }
      else
        Build(caractere, a, i+1);
    }
    J'ai une erreur de segmentation sur la fonction build. Quelqu'un peut-il m'aider?
    Merci d'avance!!!

  2. #2
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Hello!

    Ce sera difficile de te répondre sans avoir un peu plus de contexte.

    En effet, tel quel, on ne sait pas comment la fonction Build est utilisée. Or, ton problème pourrait venir des paramètres que tu lui passes, plutôt que du contenu de la fonction en elle-même. Donc il faudrait que tu fournisses un peu plus de code, notamment la partie qui fait appel à Build.

    Par exemple, faute de plus d'information, ta fonction ReadFile me semble fausse par rapport à ta fonction FileLen. Dans FileLen, tu comptes les caractères jusqu'à atteindre EOF, qui est exclu du comptage. Par contre, dans ReadFile, tu remplis ton tableau jusqu'à atteindre EOF inclus; ton tableau destination sera un caractère trop petit si tu l'as alloué en te basant sur la valeur fournie par FileLen, ce qui pourrai causer une erreur de segmentation tout de suite ou plus tard (dans la fonction Build, par exemple).

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,
    Juste un commentaire sur le début de build()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Build(char caractere[], Arbre*a, int i){  // la valeur de i DOIT être >=0 && < sizeof(caractere) à vérifier
      if(caractere[i] == EOF)  // Un caractère ne peut être EOF, écrire EOF dans un char est une erreur
        exit(0);
      if(('A'<=caractere[i]<='Z')||('a'<=caractere[i]<='z')){ // erreur, il faut toujours faire un && || entre 2 entités
      if(('A'<=caractere[i] && caractere[i] <='Z')||('a'<=caractere[i] && caractere[i]  <='z')){ // c'est plutôt cela

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Par défaut
    Bonjour,
    Tout d'abord merci pour vos réponses.
    J'ai retravaillé le code. Voici la fonction a utiliser pour construire l'arbre qui a, malgré un changement complet, toujours une erreur de segmentation.
    J'ai inclut la main pour le contexte.
    Merci d'avance pour vos réponses !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    typedef struct noeud{
      unsigned char lettre;
      struct noeud *filsg, *frered;
    }Noeud, *Arbre;
     
    Arbre AlloueNoeud(char let){
      Arbre tmp;
      tmp = (Noeud*)malloc(sizeof(Noeud));
      if (tmp == NULL)
        return NULL;
      tmp->lettre = let;
      tmp->filsg = NULL;
      tmp->frered = NULL;
      return tmp;
    }
     
     
    void Build(FILE* fichier, Arbre*a){          //La fonction pour créer l'arbre.
      char caractere = fgetc(fichier);
      if(fgetc(fichier) == EOF)
        return;
     
      if(('A'<= caractere && caractere <='Z') || ('a'<= caractere && caractere<= 'z')){
        if (a == NULL){
          (*a) = AlloueNoeud(caractere);
          Build(fichier, &((*a)->filsg));
        }
        else if(caractere == (*a)->lettre){
          if ((*a)->filsg != NULL)
    	Build(fichier, &((*a)->filsg));
          else{
    	(*a)->filsg = (Noeud*)malloc(sizeof(Noeud));
    	Build(fichier, &((*a)->filsg));}
        }
        else if(caractere > (*a)->lettre){
          if((*a)->frered != NULL)
    	Build(fichier, &((*a)->frered));
          else{
    	(*a)->frered = (Noeud*)malloc(sizeof(Noeud));
    	Build(fichier, &((*a)->frered));}
        }
     
        else if(caractere < (*a)->lettre){
          Arbre New = AlloueNoeud(caractere);
          New->frered == (*a);
          a = &New;
          Build(fichier, &((*a)->filsg));
        }
      }
      else if(caractere == '\0'){
        Arbre New = AlloueNoeud(caractere);
        (*a)->filsg = New;
      }
      else
        Build(fichier, a);
    }
     
     
    int main(int argc, char* argv[]){
      Arbre* a;
      FILE* fichier = NULL;
      fichier = fopen(argv[1],"r");
      Build(fichier, a);
      fclose(fichier);
      return 0;
    }

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Premiere ligne du main, il faut initialiser le pointeur a au moins à NULL !
    Ligne 26, si a vaut NULL, on ne peut certainement pas l'utiliser par *a la ligne en dessous !
    etc

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Par défaut
    J'ai modifié le code en prenant en compte les indication données, l'erreur est toujours là.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Arbre* AlloueNoeud(char let){
      Arbre* tmp;
      tmp = (Arbre*)malloc(sizeof(Arbre));
      if (tmp == NULL)
        return NULL;
      (*tmp)->lettre = let;
      (*tmp)->filsg = NULL;
      (*tmp)->frered = NULL;
      return tmp;
    }
     
    void Build(FILE* fichier, Arbre*a){
      char caractere = fgetc(fichier);
      if(caractere == EOF)
        return;
     
      if(('A'<= caractere && caractere <='Z') || ('a'<= caractere && caractere<= 'z')){
        if (a == NULL){
          a = AlloueNoeud(caractere);
          Build(fichier, &((*a)->filsg));
        }
        else if(caractere == (*a)->lettre){
          if ((*a)->filsg != NULL)
    	Build(fichier, &((*a)->filsg));
          else{
    	(*a)->filsg = (Noeud*)malloc(sizeof(Noeud));
    	Build(fichier, &((*a)->filsg));}
        }
        else if(caractere > (*a)->lettre){
          if((*a)->frered != NULL)
    	Build(fichier, &((*a)->frered));
          else{
    	(*a)->frered = (Noeud*)malloc(sizeof(Noeud));
    	Build(fichier, &((*a)->frered));}
        }
     
        else if(caractere < (*a)->lettre){
          Arbre* New = AlloueNoeud(caractere);
          (*New)->frered == (*a);
          a = New;
          Build(fichier, &((*a)->filsg));
        }
      }
      else if(caractere == '\0'){
        Arbre* New = AlloueNoeud(caractere);
        (*a)->filsg = (*New);
      }
      else
        Build(fichier, a);
    }
     
    int main(int argc, char* argv[]){
      Arbre a = NULL;
      FILE* fichier = NULL;
      fichier = fopen(argv[1],"r");
      Build(fichier, &a);
      fclose(fichier);
      return 0;
    }
    Help

    Merci pour vos réponses

Discussions similaires

  1. Arbre lexicographique
    Par moufmouf dans le forum Langage
    Réponses: 24
    Dernier message: 18/02/2011, 17h15
  2. Construction arbre en HTML
    Par javasmif dans le forum Struts 1
    Réponses: 1
    Dernier message: 27/08/2007, 10h49
  3. Construction d'un arbre lexicographique
    Par ColonelHati dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 03/02/2007, 08h40
  4. Arbres Lexicographiques
    Par Legio dans le forum C
    Réponses: 15
    Dernier message: 15/05/2006, 02h28
  5. [Tableaux] [api] Arbre lexicographique
    Par Husqvarna dans le forum Langage
    Réponses: 4
    Dernier message: 30/09/2005, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo