[C]Erreur de segmentation

Fermé
Moon - 21 nov. 2006 à 14:50
kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 21 nov. 2006 à 16:47
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
//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;
}

1 réponse

kij_82 Messages postés 4089 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
21 nov. 2006 à 16:47
Dans la partie suivante :
 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.


1