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

Signaler
Messages postés
6
Date d'inscription
jeudi 30 avril 2009
Statut
Membre
Dernière intervention
3 mai 2010
-
Messages postés
6
Date d'inscription
jeudi 30 avril 2009
Statut
Membre
Dernière intervention
3 mai 2010
-
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

Messages postés
416
Date d'inscription
vendredi 31 janvier 2003
Statut
Membre
Dernière intervention
19 décembre 2013
2
Salut

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

Bonne continuation.

http://liveplayaz.com

je suis heureux de faire partie d'une grande famille ...!
Messages postés
6
Date d'inscription
jeudi 30 avril 2009
Statut
Membre
Dernière intervention
3 mai 2010

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
Messages postés
416
Date d'inscription
vendredi 31 janvier 2003
Statut
Membre
Dernière intervention
19 décembre 2013
2
Salut,


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


Bonne continuation.

http://liveplayaz.com

je suis heureux de faire partie d'une grande famille ...!
Messages postés
6
Date d'inscription
jeudi 30 avril 2009
Statut
Membre
Dernière intervention
3 mai 2010

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.
Messages postés
416
Date d'inscription
vendredi 31 janvier 2003
Statut
Membre
Dernière intervention
19 décembre 2013
2
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 ...!
Messages postés
6
Date d'inscription
jeudi 30 avril 2009
Statut
Membre
Dernière intervention
3 mai 2010

Merci pour ton aide, il fallait remplir le champ code avant l'affichage.