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 :

dictionnaire en arbre et segmentation fault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut dictionnaire en arbre et segmentation fault
    Salut,

    je dois realiser un dictionnaire sous la forme d'un aire n-aire trié et dont la dernière d'un mot doit être en majuscule dans l'arbre.
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    '           b
    '          /
    '         a
    '         |
    '         L
    '        /  \
    '       i    l
    '       |    |
    '       s    o
    '       |    |
    '       E    N
    ma structure est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef char element;
     
    typedef struct arbre
    {
        element lettre;
        struct arbre * horizontal;
        struct arbre * vertical;
    } arbre_s;
    j'ai inséré le mot bal, balise et ballon.
    d'ou baL, balisE et balloN.

    j'ai une fonction lecture fichier qui lit les mots dans le fichier un par un et les enregistre,

    une fonction recherche qui recherche l'endroit ou l'on doit inserer le mot dans l'arbre dejà existant et qui retourne l'adresse du prec et

    une fonction insertion qui a partir de cette adresse, insere le mot et met sa dernière lettre ne majuscule.

    Le problème est que lors de la mise en mlajuscule, j'ai le droit à un seg fault et je ne trouve pas d'ou il vient.

    si vous arrivez à trouver,

    merci d'avance!
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    1- oubli de <ctype.h>

    2- recherche()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    while( cour != NULL && tolower( cour -> lettre) < *courmot)
    ...
    if ( cour != NULL && tolower(cour -> lettre) == *courmot )
    courmot est défini comme un char**. *courmot est donc un pointeur char*. tolower renvoie un int.
    On ne peut comparer un int et un pointeur, ça n'a pas de sens

    3- lecture_fichier()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        char mot[26];
        FILE * fic = NULL;
        char * p_mot;
     
        if (fic = fopen(nomfichier, "r"))
        {
    ...
                while (fgets(p_mot, 27, fic)!= NULL)...
    p_mot est non initialisé au moment de fgets : fgets va mettre le résultat de sa lecture n'importe où. Au mieux tu vas immédiatement planter, sinon tu planteras plus tard, au pire tu ne plantes (apparemment) pas mais le code fait n'importe quoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        if (fic = fopen(nomfichier, "r"))
        {
            fseek(fic, SEEK_SET, SEEK_END);
            if (ftell(fic) > 0)
            {
                rewind(fic);
    Le deuxième argument de fseek n'a pas à être SEEK_SET, par contre le troisième doit être SEEK_SET pour un fichier texte.
    Toute cette séquence de code ne sert à rien : à l'ouverture, on est de toute façon positionné en début de fichier

    Ecrire plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((fic = fopen(nomfichier, "r")) != NULL) ...

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    Salut, d'abord un grand merci pour tes réponses.

    La partie fseek me permet de verifier qu'il y est des mots dans le fichier et qu'il ne s''agisse pas d'un fichier vide. (ou alors je l'ai mal fait ce qui est fort possible)

    Je ne comprend pas par contre ce que tu veux dire par: p_mot pas initialisé ou comment faire pour que mon *courmot soit un int (ca a l'air de marcher malgrès le warning meme si ce n'est pas propre du tout mais je ne vois pas comment faire autrement)

    dans cet exemple le fgets marche non?
    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
    #include <stdio.h>
     
    int main() {
      char c[10];  /* declare a char array */
      FILE *file;  /* declare a FILE pointer  */
     
      file = fopen("numbers2.txt", "r"); 
      /* open a text file for reading */
     
      if(file==NULL) {
        printf("Error: can't open file.\n");
        /* fclose(file); DON'T PASS A NULL POINTER TO fclose !! */
        return 1;
      }
      else {
        printf("File opened successfully. Contents:\n\n");
     
        while(fgets(c, 10, file)!=NULL) { 
          /* keep looping until NULL pointer... */
          printf("String: %s", c);        
          /* print the file one line at a time  */
        }
     
        printf("\n\nNow closing file...\n");
        fclose(file);
        return 0;
      }
    }
    d'autre part, quand je fais un printf("%c\n", arbretemp -> lettre); dans la fonction d'insertion après l'enregistrement de la nouvelle structure, j'ai bien le premier mot arbre qui est ecrit, juste avant l'erreur sur la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        (*pere) -> lettre = toupper( (*pere) -> lettre);
    (je fais ça avant et je peux le faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        printf("coucou");
        scanf("%c", &a);
    )

    j'oubliais: le fichier mots est un fichier ou chaque ligne contient un mot
    du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bal
    ballon
    ballet
    arbre
    ...

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    dans cet exemple le fgets marche non?
    oui, et tu remarquras que dans ce code, l'argument de fgets est un tableau.
    Ton p_mot ne sert à rien, mets directement mot (ou écris avant que p_mot = mot, mais vraiment passer par l'intermédiaire de p_mot est inutile)

    comment faire pour que mon *courmot soit un int
    Le problème vient évidemment de ta déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arbre_s ** recherche( arbre_s ** tete, char ** courmot)...
    Si on regarde l'utilisation de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void insere_mot(arbre_s ** tete, char * mot)
    {...
        pere = recherche (tete, &mot);...
    Pourquoi passer à recherche l'adresse de l'adresse du début de la chaîne ? Il suffit de passer l'adresse de la chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pere = recherche (tete, mot);...
    et la fonction recherche devient naturellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arbre_s ** recherche( arbre_s ** tete, char * courmot)...
    *courmot est bien alors un entier.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    33
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Mars 2009
    Messages : 33
    Par défaut
    merci je comprend mieux mais ca souleve un nouveau probleme que je ne sais pas resoudre:

    le but d'avoir un pointeur sur mot etait de pouvoir retourner seulement la partie du mot à inserer:

    ainsi, la fonction recherche me retourne l'adresse dans l'arbre ou je dois inserer le mot ainsi que le pointeur vers la la première du mot à inserer (comme si j'avais mot[i]) et non pas le mot complet.

    avec un tableau, je pourrais utiliser l'indice (mot[i]) mais la fonction recherche me retourne deja l'adresse d'insertion: prec

    et je ne vois pas comment faire autrement,

    si tu as une idée je suis preneur!

    de plus, j'ai modifié la fonction insertion (l'endroit ou je mettais en majuscule la dernière lettre n'était pas bon)
    voici la modif:
    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
    void insere_mot(arbre_s ** tete, char * mot)
    {
        arbre_s ** pere, * cour;
     
        pere = recherche (tete, mot);
     
        if(*mot != '\0')
        {
            cour = *pere;
     
            while( strcmp(mot, "\0") != 0)
            {
                arbre_s * arbretemp;
                arbretemp = (arbre_s *) malloc (sizeof(arbre_s) );
     
                if(arbretemp )
                {
                    arbretemp -> lettre = *mot;
                    arbretemp -> vertical = NULL;
                    arbretemp -> horizontal = cour;
                    printf("mot => %c ||", *mot);
     
                    mot++;
                    if( strcmp(mot, "\0") == 0)
                    {
                    arbretemp -> lettre = toupper( arbretemp -> lettre);
                    }
     
                    printf("lettre = %c\n", arbretemp -> lettre );
                    * pere = arbretemp;
                    * pere = arbretemp -> vertical;
                    cour = * pere;
                }
     
            }
        }
    }
    mais cela ne marche pas,

    seul la dernière lettre du dernier mot est mise en majuscule,
    et j'ai le droit a un retour chariot en trop dans arbre.
    savez vous pourquoi?
    (en piece jointe, la console affiché)
    le fichier texte est de la forme:
    sans rien d'autre

    merci d'avance!
    Images attachées Images attachées  

Discussions similaires

  1. Arbre binaire de recherche - insertion - segmentation fault
    Par programmation_ dans le forum Langage
    Réponses: 2
    Dernier message: 14/11/2013, 14h41
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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