[C]Erreur de segmentation
Moon
-
kij_82 Messages postés 4089 Date d'inscription Statut Contributeur Dernière intervention -
kij_82 Messages postés 4089 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai écris 2 fonctions permettant d'ajouter des sommets dans un tableau s'ils ne sont pas encore présent.
Chaque cellule de mon arbre est composée de 4 sommets
Ma structure de cellule
Les 2 fonctions qui devraient permettre de récupérer les sommets sans doublons mais qui provoquent une erreur de segmentation.
Je ne comprends pas pourquoi et aurait besoin de votre aide pour résoudre le problème
Merci
J'ai écris 2 fonctions permettant d'ajouter des sommets dans un tableau s'ils ne sont pas encore présent.
Chaque cellule de mon arbre est composée de 4 sommets
Ma structure de cellule
//Structure représentant un point typedef struct{ int x,y,z; }Sommet; //Cellule typedef struct cell{ //les sommets composant une feuille; Sommet s0;//coin supérieur gauche Sommet s1;//coin inferieur gauche Sommet s2;//coin inferieur droit Sommet s3;//coin supperieur droit //Coordonnées du centre Sommet centre; //Pointeurs sur les fils struct cell *NW; struct cell *NE; struct cell *SW; struct cell *SE; }t_cellule;
Les 2 fonctions qui devraient permettre de récupérer les sommets sans doublons mais qui provoquent une erreur de segmentation.
Je ne comprends pas pourquoi et aurait besoin de votre aide pour résoudre le problème
Merci
//Fonction qui teste si un sommet appartient déjà au tableau //1 appartient, 0 n'appartient pas int appartient(Sommet s, Sommet *sommets[]){ int i; //je mets NULL en fin de tableau car on ne sait pas quand le tableau s'arrete for(i=0; sommets[i]!=NULL; i++) if(s.x == sommets[i]->x && s.y == sommets[i]->y && s.z == sommets[i]->z) return 1; return 0; } //Fonction qui crée un tableau des sommets en parcourant le quadtree //t_arbre arbre est l'arbre, Sommet *sommets[] contiendra les sommets void creer_tableau_sommets(t_cellule *arbre, Sommet *sommets[]){ int indice = 0; sommets = (Sommet**)malloc(sizeof(Sommet*)); if(sommets == NULL){ fprintf(stderr,"erreur allocation memoire\n"); return ; } sommets[indice] = (Sommet*)malloc(sizeof(Sommet)); if(sommets[indice] == NULL){ fprintf(stderr,"erreur allocation memoire\n"); return ; } sommets[indice] = NULL; //on est dans une feuille if(arbre != NULL && arbre->NW == NULL && arbre->NE == NULL && arbre->SW == NULL && arbre->SE == NULL){ //on vérifie si le sommet s0 a déjà été inséré if(!appartient(arbre->s0, sommets)){ sommets[indice]->x = arbre->s0.x; sommets[indice]->y = arbre->s0.y; sommets[indice]->z = arbre->s0.z; indice ++; } //on vérifie si le sommet s1 a déjà été inséré if(!appartient(arbre->s1, sommets)){ sommets[indice]->x = arbre->s1.x; sommets[indice]->y = arbre->s1.y; sommets[indice]->z = arbre->s1.z; indice ++; } //on vérifie si le sommet s2 a déjà été inséré if(!appartient(arbre->s2, sommets)){ sommets[indice]->x = arbre->s2.x; sommets[indice]->y = arbre->s2.y; sommets[indice]->z = arbre->s2.z; indice ++; } //on vérifie si le sommet s3 a déjà été inséré if(!appartient(arbre->s3, sommets)){ sommets[indice]->x = arbre->s3.x; sommets[indice]->y = arbre->s3.y; sommets[indice]->z = arbre->s3.z; indice ++; } } //on est dans des noeuds donc on descent récursivement if(arbre->NW != NULL) creer_tableau_sommets(arbre->NW, sommets); if(arbre->NE != NULL) creer_tableau_sommets(arbre->NE, sommets); if(arbre->SW != NULL) creer_tableau_sommets(arbre->SW, sommets); if(arbre->SE != NULL) creer_tableau_sommets(arbre->SE, sommets); //Une fois que tous l'arbre a été parcouru, on met le dernier indice à NULL //pour avoir un marqueur de fin //sommets[indice] = NULL; }
A voir également:
- [C]Erreur de segmentation
- Erreur 0x80070643 - Accueil - Windows
- Erreur 4201 france tv ✓ - Forum Réseaux sociaux
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Comment recuperer whatsapp supprimé par erreur - Guide
1 réponse
Dans la partie suivante :
tu as un :
qui traine au millieu, et juste apres tu fais des acces à quelque chose qui n'existe pas puisque ton pointeur ne pointe plus sur rien :
Donc il te fais une erreur de segmentation car tu pointe sur une espace non existant :) Enlève le et ca devrait allé mieux.
Sinon aussi, dans ta premiere fonction, puisque tu ne touche pas à ton tableau dans la fonction, il est inutile de mettre une * dans l'entete de la fonction pour le tableau.
sommets[indice] = (Sommet*)malloc(sizeof(Sommet)); if(sommets[indice] == NULL){ fprintf(stderr,"erreur allocation memoire\n"); return ; } sommets[indice] = NULL; //on est dans une feuille if(arbre != NULL && arbre->NW == NULL && arbre->NE == NULL && arbre->SW == NULL && arbre->SE == NULL){ //on vérifie si le sommet s0 a déjà été inséré if(!appartient(arbre->s0, sommets)){
tu as un :
sommets[indice] = NULL;
qui traine au millieu, et juste apres tu fais des acces à quelque chose qui n'existe pas puisque ton pointeur ne pointe plus sur rien :
sommets[indice]->x
Donc il te fais une erreur de segmentation car tu pointe sur une espace non existant :) Enlève le et ca devrait allé mieux.
Sinon aussi, dans ta premiere fonction, puisque tu ne touche pas à ton tableau dans la fonction, il est inutile de mettre une * dans l'entete de la fonction pour le tableau.