soucis pointeurs

soucis pointeurs - C - Programmation

Marsh Posté le 22-03-2009 à 17:00:13    

Bonjour,
Bonjour j'ai quelques soucis avec les pointeurs voici mon code je travaille en c. je voudrais pouvoir inserer des entier dans la structure b_arbre_entier qui utilise le module générique b_arbre. mais g des gros soucis avecs les pointeurs:
 
 
 
void inserer_b_arbre_entier(b_arbre_entier self,int elem)
{
   void *tmp=(void *)&elem;
   inserer_b_arbre(self->deleg,tmp);
}
 
void
inserer_b_arbre(b_arbre self,void* e)
{
     noeud r=self->racine;
     if(r->nb_cles==2*self->ordre-1)
     {
           noeud s=creer_noeud(self->ordre,self->racine->compare,self->racine->taille);
           self->racine =s;
           s->feuille=false;
           s->nb_cles=0;
 
           s->fils=malloc(sizeof(self->racine));
           s->fils[0]=r;
           partager_enfant(self,s,0,r);
           inserer_b_arbre_incomplet(self,s,e);
     }
    else
          inserer_b_arbre_incomplet(self,r,e);
}
 
int main(void)
{
       b_arbre_entier b=creer_b_arbre_entier(2,compare,sizeof(int));
 
       inserer_b_arbre_entier(b,12);
       printf("%d\n",*((int*)(*(cles(racine(b->deleg))))));        //afiiche 12 ok
       inserer_b_arbre_entier(b,8);
       printf("%d\n",*((int*)(*(cles(racine(b->deleg))))));        //affiche 8 ok
       printf("%d\n",*((int*)(*(cles(racine(b->deleg))+1))));    // affiche 8 nonnnnnnn!!!
 
return EXIT_SUCCESS;
}
 
le soucis est qu'avant meme d'avoir fini la seconde insertion le premier élément est déjà changé. ainsi avant d'avoir affecté la valeur 8 à la structure, le premier élement n'est déjà plus 12 mais 8. je crois que c'est un problème de références mais je ne vois pas du tout mon erreur. si quelqun a une idée svp.

Reply

Marsh Posté le 22-03-2009 à 17:00:13   

Reply

Marsh Posté le 22-03-2009 à 17:36:55    

Hmmouais. Ta fonction inserer_b_arbre_entier me parait pas correct du tout. Tu gardes des références d'élements pointant sur la pile dans des structures allouées dynamiquement. C'est condamné à se casser la figure.
 
Et plutôt que de te casser la tête à passer des références, passe directement la valeur entière :

Code :
  1. void inserer_b_arbre_entier(b_arbre_entier self,int elem)
  2. {
  3.      inserer_b_arbre(self->deleg, (void *) elem);
  4. }


Etc... va falloir adapter les appels dans la fonction main().
Ok, c'est un peu bancal comme approche (si sizeof (int) != sizeof (void*)), sinon va falloir passer par de l'allocation dynamique :

Code :
  1. void inserer_b_arbre_entier(b_arbre_entier self,int elem)
  2. {
  3.      int * entier = malloc(sizeof *entier);
  4.      if (entier) {
  5.          entier[0] = elem;
  6.          inserer_b_arbre(self->deleg, entier);
  7.      }
  8.      else fprintf(stderr, "Mais heu...\n" );
  9. }

 
 

Reply

Marsh Posté le 22-03-2009 à 17:46:41    

merci a toi tpierron je m-y met de suit. je te tiens au courant

Reply

Marsh Posté le 22-03-2009 à 18:01:58    

ca marche parfaitement merci beaucoup vraiment j'ai passé des heures dessus!!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed