Rechercher : dans
Par :

Probleme de segmentation sur arbre binaire.

Dernière réponse le 11 oct 2005 à 10:53:37 wlued, le 10 oct 2005 à 20:48:27 
 Signaler ce message aux modérateurs

typedef struct noeud
{
int x;
struct noeud *gauche;
struct noeud *droite;
} noeud;
noeud *inserer(noeud *n,int x)
{
noeud * feuille;
if (n==NULL)
{
feuille->x=x;
feuille->gauche=NULL;
feuille->droite=NULL;
}

else {
if (x>n->x)
{
feuille= inserer(n->droite,x);
}

else {
if (x<n->x)
{
feuille= inserer(n->gauche,x);
}

else {
if ((existe(n,x))==1)
{
feuille= n;
}
}
}
}
return feuille;
}
...
}
int main(int argc, char **argv)
{
struct noeud *n;
n=malloc(sizeof(noeud));
inserer(n,8);
afficroi(n);
affidec(n);
return EXIT_SUCCESS;
}


Bonjour à tous,
Voila un algorithme que j'ai un peu raccourci pour cibler mon probleme sur la fonction en cause : inserer( ).
J'ai une fonction existe( ) qui me renvoi un 1 si la fonction trouve la valeur dans l'arbre, et deux fonctions d'affichage.
J'ai donc un probleme de segmentation sur l'algo ci dessus (compilation ok). Il me semble juste et j'ai tenté un malloc pour palier au pb de mémoire mais ça n'a rien changé.

Le pointeur part sur une zone non autorisée donc mais je ne vois pas où.

ps : la mise en page n'a pas été prise en compte, désolé pour la lisibilité.

Meilleures réponses pour « Probleme de segmentation sur arbre binaire. » dans :
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Installation / migration Mysql 5.1 avec les binaires officiels VoirPour de multiples raisons, je préfère installer Mysql depuis les binaires compilés par Mysql ,plutôt que d'utiliser les packages (rpm, apt, ...) : les packages installent dans les répertoires de leur choix, il est difficile de maîtriser cela on...
Télécharger Binary Clock Screensaver VoirLe langage binaire est encore mal connu de tous. Cet éditeur a trouvé le moyen d'allier ce langage avec un écran de veille. Binary Clock Screensaver est un écran de veille basé sur une horloge binaire. L'interface repose sur un fond noir et des leds...
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Le codage binaire VoirPrésentation du binaire Bit Poids des bits Conversions Octet KiloOctets, MégaOctets Opérations en binaire Addition binaire Multiplication binaire Présentation du binaire Vers la fin des années 30, Claude Shannon démontra qu'à l'aide...
Segmentation de la mémoire en assembleur VoirQu'est-ce que la segmentation de la mémoire ? En assembleur, on appelle segment de mémoire le mécanisme de base de la gestion des adresses pour des processeurs de type 80x86. Les instructions sont stockées dans le registre IP. Il s'agit d'adresses...

1

kilian, le 10 oct 2005 à 21:11:05

Quand tu appeles une fois la fonction insérer, 8 est plus grand que 0 (chez moi la valeur par défaut d'un x dans un noeud fraichement alloué).

Donc premier appel de insérer() avec x=8, il va rappeler insérer sur feuille->droite pour y insérer 8.

Donc deuxième appel de inserer(), ici n==NULL (puisque tu n'a pas alloué de place pour feuille->droite précédemment).
Donc le "feuille->x=x;" provoque une erreur de segmentation, puisque la place n'a pas été allouée pour ce pointeur de noeud.

Donc juste une petite correction:

if (n==NULL)
{	
		feuille=malloc(sizeof(noeud)); // A rajouter
		feuille->x=x;
		feuille->gauche=NULL;
		feuille->droite=NULL;
}

Répondre à kilian

2

wlued, le 10 oct 2005 à 21:44:53

J'ai fait la modif et lors de la compilation j'ai implicit declaration of function.
Le pb est p-e basique mais je ne maitrise pas encore trés bien.

Répondre à wlued

3

kilian, le 10 oct 2005 à 21:49:13

Ah...
Tu pourrais me donner l'erreur complète?
Ou au pire, me citer le contenu de la ligne à laquelle se rapporte l'erreur? (si c'est un bout de code que tu n'as pas encore cité, mets tout ton code ici).

Tu as bien inclu <stdlib.h> pour le malloc?

Répondre à kilian

4

wlued, le 11 oct 2005 à 00:14:40

Le message exact est 'warning : implicit declaration of function 'maloc'.
Il porte sur la section suivante :
if (n==NULL)
{
feuille=maloc(sizeof(noeud));
feuille->x=x;
feuille->gauche=NULL;
feuille->droite=NULL;
}

En fait je n'ai fait que rajouter cette ligne au programme cité plus haut.
J'ai bien inclu le <stdlib.h>.

Répondre à wlued

5

leroy, le 11 oct 2005 à 01:09:11

Fais gaffe à la syntaxe! malloc et pas maloc!
epi fait un transtypage bien comme il faut:

feuille=(noeud*)malloc(sizeof(noeud))

@+

Répondre à leroy

6

kilian, le 11 oct 2005 à 06:54:48

Ah ben oui, maloc...

Répondre à kilian

7

wlued, le 11 oct 2005 à 08:40:16

Erf oui effectivement....
Bon l'erreur est réparée et je peux à nouveau compiler mais je récupère également mon segmentation fault.

Répondre à wlued

8

 wlued, le 11 oct 2005 à 10:53:37

Ok le pb est réglé, j'avais 'déplacé ' l'erreur en supprimant le malloc dans mon main. Le pointeur sur structure est alloué dans la fonction mais plus dans le main. Merci à vous.

Répondre à wlued