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

eemikhm Messages postés 6 Date d'inscription jeudi 30 avril 2009 Statut Membre Dernière intervention 3 mai 2010 - 5 mai 2009 à 18:18
eemikhm Messages postés 6 Date d'inscription jeudi 30 avril 2009 Statut Membre Dernière intervention 3 mai 2010 - 7 mai 2009 à 20:23
Bonjour,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.

LE CODE

#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();

}

6 réponses

nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
6 mai 2009 à 22:19
Salut

racine=(arbre*)malloc(sizeof(arbre)); // pas sizeof(arbre*)

Bonne continuation.

http://liveplayaz.com

je suis heureux de faire partie d'une grande famille ...!
0
eemikhm Messages postés 6 Date d'inscription jeudi 30 avril 2009 Statut Membre Dernière intervention 3 mai 2010
7 mai 2009 à 00:17
Merci beaucoup pour votre réponse, mon code il marche.
mais j'ai pas compris pourquoi sa marche pas avec "*"
normalement l'allocation d'espace dynamique de n'importe quel type de donnée se fait  comme sa:
var=(type)malloc(sizeof(type));
et dans mon cas mes éléments sont  des pointeurs de type arbre. c'est à dire (arbre*)
Merci d'avance
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
7 mai 2009 à 00:56
Salut,


var = (pointeur sur type) malloc( sizeof(type) );


Bonne continuation.

http://liveplayaz.com

je suis heureux de faire partie d'une grande famille ...!
0
eemikhm Messages postés 6 Date d'inscription jeudi 30 avril 2009 Statut Membre Dernière intervention 3 mai 2010
7 mai 2009 à 18:43
Merci beaucoup pour ton aide  [auteur/NICKYDAQUICK/43984.aspx nickydaquick], Mais j'ai maintenant un autre problème
j'ai une structure "arbre" qui est la suivante:

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

/* **************  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;}
 }
}

je sais 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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
7 mai 2009 à 18:56
Salut,

c'est parce que dans ton code (au debut de la page) la racine n'a pas de fils; sinon ton code me semble bon. Si tu as toujours ce pb poste ton code au complet.

Bonne continuation

http://liveplayaz.com

je suis heureux de faire partie d'une grande famille ...!
0
eemikhm Messages postés 6 Date d'inscription jeudi 30 avril 2009 Statut Membre Dernière intervention 3 mai 2010
7 mai 2009 à 20:23
Merci pour ton aide, il fallait remplir le champ code avant l'affichage.
0
Rejoignez-nous