[C]Problème de pointeurs
Résolu
Nieli
Messages postés
85
Statut
Membre
-
Nieli Messages postés 85 Statut Membre -
Nieli Messages postés 85 Statut Membre -
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
- Le pointeur de mon pc portable ne marche plus - Guide
- Pointeur de souris - Guide
- Agrandir le pointeur de la souris - Guide
- Le pointeur de la souris - Guide
- Deux Pointeurs Souris Sous Windows ? ✓ - Forum Windows
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