[C]Problème de pointeurs
Résolu
Nieli
Messages postés
83
Date d'inscription
Statut
Membre
Dernière intervention
-
Nieli Messages postés 83 Date d'inscription Statut Membre Dernière intervention -
Nieli Messages postés 83 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'essaye d'implémenter des Arbres binaires par position en C.
Mon problème est que je n'arrive pas à trouver ce qu'il faut utiliser ((*a),&a, *a etc x_X) pour que l'arbre modifié par la fonction inserer_aux soit transmis à inserer et au main.
Voilà mon code :
Voilà, si vous pouvez m'aider...n'hésitez pas.
Merci d'avance,
Nieli.
J'essaye d'implémenter des Arbres binaires par position en C.
Mon problème est que je n'arrive pas à trouver ce qu'il faut utiliser ((*a),&a, *a etc x_X) pour que l'arbre modifié par la fonction inserer_aux soit transmis à inserer et au main.
Voilà mon code :
/*Structure de données: Arbre binaire de recherche*/ #include <stdio.h> #include <stdlib.h> #include <assert.h> /* Définition de la structure Noeud d'un arbre*/ typedef struct Noeud{ void *data; struct Noeud* fils_gauche; struct Noeud* fils_droit; int taille; } *Arbre; Arbre inserer_aux (void *v, Arbre *ap, int pos) { Arbre a=*ap; if (a==NULL) { a = (Arbre)malloc(sizeof(struct Noeud)); a->taille = 1; a->fils_gauche = NULL; a->fils_droit = NULL; a->data = v; fprintf(stdout,"Valeur Ajoutée à l'arbre : %d\n",(int)a->data); return a; } else { if(pos <= a->fils_gauche->taille) { a->fils_gauche = (Arbre)inserer_aux(v,&a->fils_gauche,pos); a->taille++; return a; } else { a->fils_droit = (Arbre)inserer_aux(v,&a->fils_droit,pos-a->fils_gauche->taille-1); a->taille++; return a; } } } void inserer (void *v, Arbre *ap, int pos) { Arbre a=*ap; assert(a==NULL || 0 <= pos && pos <= a->taille); inserer_aux(v,ap,pos); } int main(int argc, char *argv[]) { Arbre *a =(Arbre*)malloc(sizeof(struct Noeud)); inserer((void *)5,a,0); inserer((void *)2,a,0); Arbre ap = *a; if(ap==NULL) printf("test\n"); return 0; }
Voilà, si vous pouvez m'aider...n'hésitez pas.
Merci d'avance,
Nieli.
A voir également:
- [C]Problème de pointeurs
- Comment faire apparaître le pointeur de la souris - Guide
- Le pointeur de mon pc portable ne marche plus - Guide
- Agrandir le pointeur de la souris - Guide
- Manipulation des pointeurs - Forum C
- Placer les pointeurs statistiques??? ✓ - Forum Webmastering
2 réponses
Bon j'ai pas tout lu mais je vois une erreur de taille:
inserer((void*)5 ,a, 0);
(void*)5 ---> Erreur de manipulation de pointeur, probablement un plantage assuré et pour le moins ce ne sera pas l'effet escompté.
(void*)5 ---> Quelle est la signification? On passe un pointeur dont la valeur est 5, c'est-à-dire que le pointeur désigne la case mémoire n° 5, ce qui ici n'a aucun sens (bien sûr la case n° 5 existe, ça fait partie de la table des pointeurs d'interruption (sauf expert: ne pas toucher, ça brûle !!!)).
Il faut donc écrire quelque chose du genre:
int w=5;
inserer((void*)&w, a, 0);
Mais évidemment il faudra faire attention à ce que le 'w' reste défini sinon il faut plutôt écrire:
int* w;
w = (int*)malloc(sizeof(int));
w = 5;
inserer((void*)w, a, 0);
D'autre part:
a->fils_gauche = (Arbre)inserer_aux(v,&a->fils_gauche,pos);
peut s'écrire plus simplement:
a->fils_gauche = inserer_aux(v,&a->fils_gauche,pos);.
Bon courage
inserer((void*)5 ,a, 0);
(void*)5 ---> Erreur de manipulation de pointeur, probablement un plantage assuré et pour le moins ce ne sera pas l'effet escompté.
(void*)5 ---> Quelle est la signification? On passe un pointeur dont la valeur est 5, c'est-à-dire que le pointeur désigne la case mémoire n° 5, ce qui ici n'a aucun sens (bien sûr la case n° 5 existe, ça fait partie de la table des pointeurs d'interruption (sauf expert: ne pas toucher, ça brûle !!!)).
Il faut donc écrire quelque chose du genre:
int w=5;
inserer((void*)&w, a, 0);
Mais évidemment il faudra faire attention à ce que le 'w' reste défini sinon il faut plutôt écrire:
int* w;
w = (int*)malloc(sizeof(int));
w = 5;
inserer((void*)w, a, 0);
D'autre part:
a->fils_gauche = (Arbre)inserer_aux(v,&a->fils_gauche,pos);
peut s'écrire plus simplement:
a->fils_gauche = inserer_aux(v,&a->fils_gauche,pos);.
Bon courage
Bonsoir(mnt),
Merci de t'être interressé à mon problème.
Mon idée était plutôt de faire quelque chose comme ça
(Tiré de CCM).
Pour pouvoir passer n'importe quel type d'objet.
Sinon, pourrais-tu m'expliquer pourquoi
Arbre *a = (Arbre *)malloc(sizeof(struct Noeud));
printf("Main: %p\n",a);
Arbre *ab = a;
printf("Main: %p\n",&ab);
Pourquoi les adresses sont elles différentes? Je comprends vraiment pas :/
Merci d'avance,
Nieli
Merci de t'être interressé à mon problème.
Mon idée était plutôt de faire quelque chose comme ça
Il est toutefois possible de définir un pointeur sur 'void', c'est-à-dire sur quelque chose qui n'a pas de type prédéfini (void * toto). Ce genre de pointeur sert généralement de pointeur de transition, dans une fonction générique, avant un transtypage permettant d'accéder effectivement aux données pointées
(Tiré de CCM).
Pour pouvoir passer n'importe quel type d'objet.
Sinon, pourrais-tu m'expliquer pourquoi
Arbre *a = (Arbre *)malloc(sizeof(struct Noeud));
printf("Main: %p\n",a);
Arbre *ab = a;
printf("Main: %p\n",&ab);
Pourquoi les adresses sont elles différentes? Je comprends vraiment pas :/
Merci d'avance,
Nieli