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 :

Un pb lors d'allocation de 3eme elts de type arbre


Sujet :

C

  1. #1
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 167
    Points : 88
    Points
    88
    Par défaut Un pb lors d'allocation de 3eme elts de type arbre
    Bonjours, le programme suivant est écrit et exécuter par DEVC++.
    Pas d’erreurs de compilation, le problème c’est que lors de l’exécution de la 4eme itération de la boucle for, le programme s’arrête.
    J’ai mit devant chaque instruction a l’intérieur de « for » un « printf »pour savoir il est ou le problème exactement et j’ai trouvé que : si par exemple le nombre des éléments de mon tableau égale à 5 qui est le même nombre d’itération de la boucle, le programme s’exécute très bien dans les 3 premières itération , lors de la quatrième itération il s’arrêt au niveau d’allocation d’espace mémoire de l’élément « racine » de type arbre
    Je vous en pris aidez moi pour savoir pourquoi j’ai ce problème.
    en attente de vous propositions.
    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<conio.h>
    #include<math.h>
    #include<malloc.h>
    main()
    {
    typedef struct elt {int info; struct elt*succ_gauche;struct elt*succ_droit;}arbre;
    arbre**niveauzero;// declaration de vecteur qui va contenir les adresse des elements de type arbre
    arbre*racine;//declaration d'un element de type arbre
     int n,x,i;
    printf("donnez le nombre d'elements de tableau");
    scanf("%d",&n);
    niveauzero=(arbre**)malloc(n*sizeof(arbre*));//Allocation d'espace pour le vecteur qui va contenir les adresses des feuilles
    for(i=0;i<n;i++)
       {printf("donnez une valeur ");
        scanf("%d",&x);printf("lecture bien effectuer %d\n",i);
        racine=(arbre*)malloc(sizeof(arbre*));printf("allocation est de l'element racine est termine %d\n",i);//Allocation d'espace pour chaque feuille
        racine->info=x;printf("affectation de x au champ info de la racine %d\n",i);
        racine->succ_gauche=racine->succ_droit=NULL;printf("initialisation de fils gauche et droit %d\n",i);
        niveauzero[i]=racine;printf("affectation a niveaude i l'adresse de racine %d\n",i);
     
        }
     
    getche();
    }

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Je n'ai pas tout lu, mais il me semble que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    racine=(arbre*)malloc(sizeof(arbre*))
    ce devrait être sizeof(arbre). Du coup, ça doit provoquer quelques écrasements

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est pourquoi il est mieux de faire ceci:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    racine = malloc(sizeof *racine);
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 167
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Je n'ai pas tout lu, mais il me semble que dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    racine=(arbre*)malloc(sizeof(arbre*))
    ce devrait être sizeof(arbre). Du coup, ça doit provoquer quelques écrasements
    niveauzero=(arbre**)malloc(n*sizeof(arbre*))
    Mais il faut faire le "n" par ce qu'il permet d'allouer l'espace pour n cases du tableau qui sont de type arbre

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par eemii Voir le message
    niveauzero=(arbre**)malloc(n*sizeof(arbre*))
    Mais il faut faire le "n" par ce qu'il permet d'allouer l'espace pour n cases du tableau qui sont de type arbre
    Salut,
    Je ne parle pas de niveauzero mais de racine, c'est à dire un élément d'arbre et pas le tableau...

  6. #6
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 167
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Je ne parle pas de niveauzero mais de racine, c'est à dire un élément d'arbre et pas le tableau...
    Merci beaucoup pour ton aide 3DArchi, Mais j'ai maintenant un autre problème
    j'ai une structure "arbre" qui est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct elt {
    int info;
    int code; 
    struct elt*succ_gauche;
    struct elt*succ_droit;
    }arbre;
    Et je veux mettre dans cet le champ code de la structure 0 s'il s'agit du fils gauche et 1 s'il s'agit d'un fils droit
    pour faire ça j'ai créer une fonction préfixe qui est en bleu.
    Mais lors de l'appel de la fonction par l'instruction prefixe(racine,0); le champ CODE de l'arbre n'est pas modifier(" il m'affiche des valeurs trop grandes je crois qu'ils sont des adresses")
    Aidez moi de trouver ou il est le problème

    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
    /* **************  premitive arbre vide*********/
    int vide(arbre*a)
    {
       if(a==NULL) 
          return (1); 
       else 
          return (0);
    }
    /* **************  premitive arbre fils GAUCHE*********/
    arbre*filsgauche(arbre*a)
    {
       return(a->succ_gauche);
    }
    /* **************  premitive arbre FILS DROITTTTT*********/
    arbre*filsdroit(arbre*a)
    {
       return(a->succ_droit);
    }
    /* **************  premitive arbre feuilllleeee*********/
    int feuille(arbre*a)
    {
       if (       
             (   (a->succ_gauche)==NULL)
         &&(    (a->succ_droit)==NULL   )
        ) 
          return (1);
     else  
          return (0);
    }
    /* **************  PARCOURS PREFIXEEEEE*********/
    void prefixe(arbre*a, int indice)
    {
       if (!vide(a))
       {
          printf(" ******  %d  *****  code:   %d   ************\n", 
             a->info, a->code);
          if(!feuille(a))
          {
             if (indice==0)  
                a->code=0; 
             else  
                a->code=1;
              prefixe(filsgauche(a),0);
              prefixe(filsdroit(a),1);
         }
         else
         {
             if (indice==0)  
                a->code=0; 
             else  
                a->code=1;
         }
      }
    }
    peux être que la solution est de transférer le l'élément "a" par adresse c'est à dire "arbre**a", Mais je sais pas ou il faut introduire des modifications dans le fonction
    Merci d'avance.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Ton problème n'est-il pas que tu fais le printf avant le changement de la valeur et non après ?
    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
     
    void prefixe(arbre*a, int indice)
    {
       if (!vide(a))
       {
          if (indice==0)  
             a->code=0; 
          else  
             a->code=1;
          printf(" ******  %d  *****  code:   %d   ************\n", 
             a->info, a->code);
          if(!feuille(a))
          {
              prefixe(filsgauche(a),0);
              prefixe(filsdroit(a),1);
         }
      }
    }

  8. #8
    Membre régulier
    Femme Profil pro
    Inscrit en
    Mai 2008
    Messages
    167
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 167
    Points : 88
    Points
    88
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Bonjour,
    Ton problème n'est-il pas que tu fais le printf avant le changement de la valeur et non après ?
    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
     
    void prefixe(arbre*a, int indice)
    {
       if (!vide(a))
       {
          if (indice==0)  
             a->code=0; 
          else  
             a->code=1;
          printf(" ******  %d  *****  code:   %d   ************\n", 
             a->info, a->code);
          if(!feuille(a))
          {
              prefixe(filsgauche(a),0);
              prefixe(filsdroit(a),1);
         }
      }
    }
    Merciiiiiiiiiiii beaucoup j'ai pas remarqué que j'ai affiché avant de remplir le champ code.
    Merci encore une fois

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

Discussions similaires

  1. Choisir le répertoire de départ lors d'un upload de fichier (input type="file")
    Par _jey_ dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 16/07/2010, 16h42
  2. Réponses: 1
    Dernier message: 16/03/2008, 19h06
  3. Erreur lors d'allocations
    Par ledjlale dans le forum Qt
    Réponses: 2
    Dernier message: 26/07/2007, 10h16
  4. Allocation pointeur (pointeur dans un type)
    Par tyler007 dans le forum Fortran
    Réponses: 11
    Dernier message: 01/06/2007, 14h39
  5. Réponses: 3
    Dernier message: 26/02/2006, 23h53

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