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 :

problème d'éxécution d'un programme en DEVCPP


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 11
    Points : 17
    Points
    17
    Par défaut problème d'éxécution d'un programme en DEVCPP
    bonsoir à tous,
    J'ai un problème d'exécution. Voici le lien ou se trouve l'énoncé de mon programme http://pages-perso.esil.univ-mrs.fr/...m02/index.html
    l'énoncé est accompagné de la correction, et voici mon code primitif :
    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
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    #include<stdio.h>
    #include<conio.h>
    #include<stdlib.h>
    #include<string.h>
    typedef struct sommet
    {
      char * mot; 	       
      struct sommet * fg;  
      struct sommet * fd;  
    } Sommet, * Abr;
     
    typedef struct maillon
    {
      int lg;               
      Abr arbre;             
      struct maillon* suiv;                       
    }Maillon, * Foret;
     
    //declaration des fonctions
    Abr nouveausmt(const char * s)
    {
     Abr p;            //équivaut à Sommet*p 
     p=(Abr)malloc(sizeof(Sommet));
    //on reserve une autre espace mémoire pour mot puisqu'elle pointe vers une costante donc sa valeur pointée sera non modifiable 
     p->mot=(char *)malloc(strlen(s)*sizeof(char)); 
     strcpy(p->mot,s);
     p->fg=p->fd=NULL;
     return p;
    }
    Foret nouveaumaillon(int x,Abr r)
    {
     Foret p;     // équivaut à Maillon *p
     p=(Foret)malloc(sizeof(Maillon));
     p->lg = x;
     p->arbre=r;
     p->suiv=NULL;
    return p;
    }
     
    int cherche(const char * s,Abr r)  //cette fonction ne sert à rien
    {
     Abr p;//en C on n'a pas le type booléen,c'est pour ça on utilise le type int,0 pour faux (n'éxiste pas),et autrement pour vrai (existe)
     if(r==NULL)        //arbre vide
      return 0;               
     else
      if(strlen(p->mot)!=strlen(s))//cela va diminuer le temps d'éxécution si la taille de l'arbre est grande
       return 0;
      else
      {
       p=r;
       while(p!=NULL)
        if(strcmp(p->mot,s)==0)   
         return 1;
        else
         if((strcmp(p->mot,s))>0)
          p=p->fg;
         else        
          p=p->fd;      
       if(p==NULL)      
        return 0;   
      }     
    }
     
    void insere(const char * s,Abr * r)        //r est passé par adresse
    {
     if (r==NULL)
      *r=nouveausmt(s);
     else
      if(strcmp((*r)->mot,s)==0)
       printf("le sommet existe deja\n");
      else
       if(strcmp((*r)->mot,s)>0)
        insere(s,&(*r)->fg);
       else
        insere(s,&(*r)->fd);
    }
    void insereforet(const char * s,Foret * f) //f est passé par adresse        
    {    
     Foret p,ptr,pred;
     int n=strlen(s);    
     if(*f==NULL)   //foret vide
      *f=nouveaumaillon(n,nouveausmt(s));
     else
     {      
      p=*f;   
      while(p->lg<strlen(s)&& p!=NULL)
      {
       pred=p;   
       p=p->suiv;
      }      
      if(p!=NULL)
       if(p->lg==n)
        insere(s,&p->arbre);
       else   //(p->lg)>(strlen(s))
        {
         ptr=nouveaumaillon(n,nouveausmt(s));     
         if(p==*f)  //insertion d'un nouveau maillon au début
         {
          ptr->suiv=*f;
          *f=ptr;
         }
         else        //insertion d'un nouveau maillon au milieu
         {
          pred->suiv=ptr;
          ptr->suiv=p;
         }
       }  
      else     //p==NULL  ça veut dire insertion à la fin
       pred->suiv=nouveaumaillon(n,nouveausmt(s));
     }       
    }
    void imprimeabr(Abr r)
    {
     if(r!=NULL)
      {
       printf("%s   ",r->mot);       //retour chariot,on laisse 3 distance entre les mots                 
       imprimeabr(r->fg);
       imprimeabr(r->fg);                                                                             
      }                                                                                                 
    }                                                                                                  
    void imprimeforet(Foret f)                                                              
    {                                                                                               
     Foret p=f;                                                                                                             
     while(p!=NULL)                                                                                    
      {
       printf("mots de longeur %d: \n",p->lg); //retour chariot,on laisse 3 distance entre les mots
       imprimeabr(p->arbre);
       p=p->suiv;
      }
    }  
    //programme principale                                                                              
    main()
    {
     int i;
      char s[7];
      Foret tete=NULL;
      for (i=0;i<10;i++) {
        printf("entre le %d eme mot :\n ",i);
        scanf("%s",s);
        insereforet(s,&tete);
      }
      imprimeforet(tete);
      printf("\n");                           
     getch(); //arreter l'éxécution         
    }
    le compilation marche normalement, mais quand j'exécute ce programme, il s'arrête au niveau de la deuxième itération du FOR et un message d'erreur apparait :
    foret.exe a rencontré un problème et doit fermer
    foret étant le nom du programme
    j'ai essayé de comparer mon code à la solution qui est correcte, pour cela j'ai réécrit la solution en gardant la fonction insereForet de mon code, ce qui prouve que l'erreur existe dans cette dernière.
    Quelqu'un pourrait m'aider svp

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Bonjour et bonne année

    Voici une lecture critique de ton code avec des remarques qui pourront peut être te servir :

    ****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Abr nouveausmt(const char * s)
    {
     Abr p;            //équivaut à Sommet*p 
     p=(Abr)malloc(sizeof(Sommet));
     p->mot=(char *)malloc(strlen(s)*sizeof(char)); 
     strcpy(p->mot,s);
    ....
    - Le fait que tu juges utile d'ajouter en commentaire que Abr est un Sommet* montre que c'est rarement une bonne idée pour la lisibilité de cacher la nature pointeur dans un typedef.
    - Après une allocation, il est prudent de vérifier, avant de l'utiliser, que la valeur retournée par malloc n'est pas NULL.
    - il est inutile de caster le retour de malloc (mais ce n'est pas une erreur en C).
    - il y a une erreur : strlen ne compte pas le zéro terminal. Il faut donc ajouter 1 pour l'allocation.
    - sizeof(char) vaut toujours 1.

    Voici une version de cette fonction tenant compte de ces observations.
    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
    Abr nouveausmt(const char * s)
    {
     Abr p;            //équivaut à Sommet*p 
     p = malloc(sizeof *p);
     if(p != NULL)
     {  //on reserve une autre espace mémoire pour mot puisqu'elle pointe vers une costante donc sa valeur pointée sera non modifiable 
        p->mot=malloc(strlen(s)+1);
        if(p->mot != NULL)
        { 
           strcpy(p->mot,s);
           p->fg = p->fd = NULL;
        }
        else
        { // Echec d'allocation, on nettoie tout
           free(p);
           p = NULL;
        }
     } 
     return p;
    }
    ****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Foret nouveaumaillon(int x,Abr r)
    - voir les remarques ci-dessus

    ****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int cherche(const char * s,Abr r)
    - pas lu puisqu'elle ne sert à rien

    ****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void insere(const char * s,Abr * r)        //r est passé par adresse
    {
     if (*r==NULL)
    - Erreur

    ****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void insereforet(const char * s,Foret * f) //f est passé par adresse
    {
    ....
      while(p!=NULL && p->lg<strlen(s))
    Erreur dans l'ordre des tests : c'est un des rare cas où l'ordre d'évaluation des opérandes est fixé. On doit tester d'abord que p!=NULL avant de pouvoir évaluer p->lg<strlen(s) sinon plantage assuré lorsque p==NULL

    ****
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void imprimeabr(Abr r)
    {
     if(r!=NULL)
      {
       imprimeabr(r->fg);
       printf("%s   ",r->mot);       //retour chariot,on laisse 3 distance entre les mots
       imprimeabr(r->fd);
      }
    }
    -Erreur (de copier coller) : on imprimait deux fois le même abre r->fg
    -Si on veut un affichage dans l'ordre alphabétique (je le suppose, mais je n'ai pas lu le sujet), l'ordre des affichages était incorrect.

    ****- Ecriture obsolète : on doit maintenant spécifier explicitement le type de retour int.
    - Il manque la valeur de retour du main (return 0)
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2009
    Messages : 11
    Points : 17
    Points
    17
    Par défaut
    je vous remercie beaucoup pour l'intervention,le problème est resolu
    Si on veut un affichage dans l'ordre alphabétique (je le suppose, mais je n'ai pas lu le sujet), l'ordre des affichages était incorrect
    c'est vraie,cet ordre est obtenue à partir du parcours infixé,mais l'ordre demandé est l'ordre préfixe (voir l'énoncé)
    bonne année

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème lors de l'éxécution d'un programme
    Par IlaeFlo dans le forum Général Python
    Réponses: 4
    Dernier message: 04/06/2007, 14h16
  2. Problème d'éxécution de programme sur 2ème disque dur
    Par thepinguin dans le forum Composants
    Réponses: 3
    Dernier message: 20/02/2007, 10h30
  3. Réponses: 2
    Dernier message: 11/06/2006, 16h53
  4. [MFC] problème d'éxécution
    Par ben_iap dans le forum MFC
    Réponses: 2
    Dernier message: 15/03/2004, 10h31
  5. éxécution d' un programme >> que contient la ram ???
    Par bob_sapp dans le forum Langages de programmation
    Réponses: 9
    Dernier message: 18/01/2004, 21h16

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