Erreur "Segmentation fault" en C++

antgre Messages postés 10 Date d'inscription samedi 17 avril 2004 Statut Membre Dernière intervention 22 avril 2004 - 22 avril 2004 à 15:18
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 - 22 avril 2004 à 17:06
Bonjour a tous,

Je travaille sur un programme dont une partie doit implementer une liste de points.
Chaque point comprenant un certain nombre de caractéristiques.

Ma classe point marche très bien.

J'ai ensuite créé une classe list qui represente une liste d'objet T (template)

et enfin, j'ai créé une classe Pointlist qui crée des liste de points.

j'arrive (apres nombreux preoblèmes ;) ) à compiler ... Et quand je lance mon programme de test, j''obtiens
"Segmentation fault"

Je vous mets mes classes .h et .cpp ...

Merci d em'aider si vous avez quelques minutes :shy)

point.h

/* MISE A JOUR : 17/04/2004 18h19
PAR : Ant
*/

#ifndef point_h
#define point_h
/* 
  @ author: Delmoitié Damien
    Grenier Antoine
            Rahier Benjamin
  @ date  : Mars 2004
 classe définissant les méthodes de la classe point.cpp
*/

class point 
    {
        public:
                point(double x, double  y, double  u, double  v);
                point();   
                void setX (double  n);
                void setY (double  n);
                void setU (double  n);
void setV (double  n);
void set(double x, double  y, double  u, double  v);
                double  getX ();
                double  getY ();
double  getU ();
                double  getV ();
                double  getVIT ();
double  getDIST (point P);
double  getDIST (double x, double y);
             
        private:
                double   X;
                double   Y;
                double   U;
double   V;
double   VIT;
double   DIST;  
                
    };
    
#endif



______________________________________________________________________

point.cpp

/* MISE A JOUR : 22/04/2004 15h02
PAR : Ant
REM : separation de la classe de test
*/

/* 
  @ author: Grenier Antoine
            Delmoitie Damien
    Rahier Benjamin
  @ date  : Mars 2004
  classe permettant la gestion de differents points qui contiennent positions et vitesses
*/

#include "point.h"
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include 

//Constructeur avec données
point::point(double x, double  y, double  u, double  v){
    X =   x;
    Y = y;
    U = u;
    V = v;
};

//Constructeur sans donnée
point::point(){
// initialisation d'1 point (0,0) &#65533;une vitesse (0,0)
    X = 0.0;
    Y = 0.0;
    U = 0.0;
    V = 0.0;
};

// Definir la position en X
void point::setX (double n){
        X = n;   
    }; 

// Definir la position en Y
void point::setY (double n){
        Y = n;      
    }; 

// Definir la vitesse U
void point::setU (double n){
        U = n;  
    }; 

// Definir la vitesse V
void point::setV (double n){
        V = n; 
    }; 
    
    //définir la position et les vistesses en une fois pour Damien
void point::set(double x, double  y, double  u, double  v){
    X = x;
    Y = y;
    U = u;
    V = v;
};
    
// renvoit la position en X   
double point::getX (){
        return X;        
    }; 

// renvoit la position en Y
double point::getY (){
        return Y;   
    }; 

// renvoit la vitesse U  
double point::getU (){
        return U;  
    }; 

// renvoit la vitesse V  
double point::getV (){
        return V;  
    }; 

// renvoit la vitesse moyenne  
double point::getVIT (){
VIT = sqrt(pow(U,2) + pow(V,2));
        return VIT;  
    }; 
    

//renvoit la distance entre deux points
double  point::getDIST (point P){
DIST=sqrt(pow(X-P.getX(),2) + pow(Y-P.getY(),2));
return DIST;
};
    
//renvoit la distance entre un point et une position
double  point::getDIST (double x, double y){
DIST=sqrt(pow(X-x,2) + pow(Y-y,2));
return DIST;
};



______________________________________________________________________

list.h

/* MISE A JOUR : 17/04/2004
PAR : Ant
QUOI : compris un peu
*/

#ifndef list_h
#define list_h

/* 
  @ author: Delmoitie Damien
    Grenier Antoine
            Rahier Benjamin
  @ date  : Mars 2004
  classe permettant la gestion d'une structure de donn? de type liste et
  utilisant la classe template.
*/

#include 

using namespace std;

template <class T> 
class list 
    {
        public: list();
                ~list();
                bool add(T *ele);
                T *remove();
                void next();
                void setElement(T *ele);
                T *getCurrent();
                int getLength()const;
                bool isEmpty() const;
                bool isOk() const;
                bool isFirst();
                bool isEnd() const;
                void setFirst();
    
        private:
                
                //d'inition d'une structure des maillons "NOEUDS" de la list
                typedef struct NOEUD{
                        struct NOEUD *next;
                        T *element;
                        }Node;
        
                Node *head;
                Node *tail;
                Node *current;                
        
  
    };
    

    
  // CONSTRUCTEUR    
template <class T> 
list<T>::list(){    head   current   tail = new Node;
    head->next = NULL;
    current->next = NULL;
    tail->next = NULL;
};

// DESTRUCTEUR
template <class T>
list<T>::~list(){
    setFirst();
        while(!isEmpty()){
                Node *del;
                del=current->next;
                current->next=del->next;
                delete del;
        }
    delete head;
    delete tail;
    delete current;
}

//Ajoute un element dans la liste
template <class T>
bool list<T>::add(T *ele){    bool isFail (current NULL);
    if (current!=NULL){
        Node *pro;
        pro = new Node;
        pro->next = current->next;
        pro->element = ele;
        current->next= pro;
        if (tail == current)tail=current->next;
    }
    return isFail;
};

//verifie que current ne Te pas vers un element NULL
template <class T>
bool list<T>::isOk() const{
    return current != NULL && current->next != NULL;
};

//supprime current de la liste et renvoie l'element contenu dans le noeud
template <class T>
T  *list<T>:: remove(){
    T *rem = NULL;
    if (isOk()){
        rem = current->next->element;
        Node *remo=current->next;
        current->next=remo->next;
        if (tail == remo) {
                tail = current;
        }
        delete remo;
    }
    return rem;
};

//place current sur le noeud suivant
template <class T>
void list<T>::next(){
    if (current!= NULL){
        current = current->next;
    }
};

template <class T>    
void list<T>::setElement(T *ele){
    if(isOk()){
        current->next->element = ele;
    }
};

//retourne l'element qui se trouve dans le noeud apres current
template <class T>
T *list<T>::getCurrent(){
    T *el=NULL;
    if (isOk()){
        el=current->next->element;
    }
    return el;
};

//Retourne la longueur de la liste
template <class T>
int list<T>::getLength()const{ 
    int counter = 0;
    Node *temp;
    temp = head;
    while(temp->next != NULL){
        counter++;
        temp = temp->next;
    }
    return counter;
};

//Verifie que la liste n'est pas vide
template <class T>             
bool list<T>::isEmpty() const{return head->next == NULL;};

//Verifie que l'element n'est pas le dernier
template <class T>
bool list<T>::isEnd() const{return current->next == NULL;};

//Verifie que l'element n'est pas le permier
template <class T>
bool list<T>::isFirst() {return current->next->next == NULL;};

//Definit le premier element
template <class T>
void list<T>::setFirst(){current = head;};

#endif



______________________________________________________________________

Pointlist.h

/* MISE A JOUR : 19/04/2004
PAR : Ant
*/

#ifndef Pointlist_h
#define Pointlist_h
/* 
  @ author: Delmoitie Damien
    Grenier Antoine
            Rahier Benjamin
  @ date  : Mars 2004
  classe permettant de cr&#65533;r une liste de points
*/

#include "list.h"
#include "point.h"
#include 

//typedef list listPoint;

class Pointlist : public list 
    {
        public:
                Pointlist();
                ~Pointlist();
void Pointlist::trier(double x, double y);
                
        private:
          Pointlist *LISTE;

       };
    
#endif



______________________________________________________________________

Pointlist.cpp

/* MISE A JOUR : 22/04/2004 15h02
PAR : Ant
REM : separation de la classe de test
*/

/* 
  @ author: Delmoitie Damien
    Grenier Antoine
            Rahier Benjamain
  @ date  : Mars 2004
  classe permettant de créer une liste de points
*/

#include 
#include "Pointlist.h"
#include "list.h"
#include "point.h"

//définition d'une liste contenant des points
//typedef list listPoint;
    
//constructeur
Pointlist::Pointlist(){
    LISTE   = new Pointlist();
}

//destructeur
Pointlist::~Pointlist(){
    delete LISTE;
}

// void Pointlist::add(point P){
// 	LISTE->add(P);
// }

//Trie la liste de l'element le plus proche en fonction d'une position
void Pointlist::trier(double x, double y){

cout << "tri de la liste...";

// Initialisation
Pointlist *L =  new Pointlist(); 
point *p1 = new point();
point *p2 = new point();
bool etat;

L->add(LISTE->getCurrent());
LISTE->next();

while(LISTE->isOk()){
p1=LISTE->getCurrent();
p2=L->getCurrent();
etat=0;
while((L->isOk()) & (etat=0)){
//Comparaison des distances
if (p1->getDIST(x,y)getDIST(x,y)){ 
L->setElement(p1); 
etat=1; }
L->next();
};
LISTE->next();
};
*LISTE=*L;
}



______________________________________________________________________

Et enfin ... La classe de test ...

//CLASSE DE TEST

/* MISE A JOUR : 22/04/2004
PAR : Ant
*/

/* 
  @ author: Delmoitie Damien
    Grenier Antoine
            Rahier Benjamain
  @ date  : Mars 2004
  classe permettant de créer une liste de points
*/

#include 
#include "Pointlist.h"
#include "list.h"
#include "point.h"

int main()  {

Pointlist *L1   = new Pointlist();

point *P = new point();
point *P1 = new point(0.0,0.0,0.0,0.0);
point *P2 = new point(1.0,1.0,0.0,0.0);
point *P3 = new point(2.0,2.0,0.0,0.0);
point *P4 = new point(3.0,2.0,0.0,0.0);
point *P5 = new point(6.0,3.0,0.0,0.0);
 
bool a = L1->isOk();

L1->add(P1);
L1->add(P2);
 	L1->add(P3);

double d = L1->getLength();
  
P->setX(L1->getCurrent()->getX());
double b = P->getX();

L1->remove();
P->setX(L1->getCurrent()->getX());
double c = P->getX();

L1->add(P4);
L1->add(P5);

L1->trier(3.0,3.0);

  cout<< "|---------------------|" << endl;
  cout<< "| TEST CLASSE LIST  : |" << endl;
  cout<< "|---------------------|" << endl;
  cout<< "| Fonction isOk()     |" << endl;
  cout<< "ca doit Afficher 0 " << endl;
  cout<< a << endl;
  cout<< "| Fonction add()      |" << endl;
  cout<< " ca doit Afficher 2" << endl;
  cout<< b << endl;
  cout<< "| Fonction remove()      |" << endl;
  cout<< " ca doit Afficher 1" << endl;
  cout<< c << endl;
  cout<< "| Fonction getLength()      |" << endl;
  cout<< " ca doit Afficher 3" << endl;
  cout<< d << endl;
  cout<< "|---------------------|" << endl;
  cout<< "|FIN DU TEST : bravo !|" << endl;
  cout<< "|---------------------|" << endl;
  
  return 1;
};



______________________________________________________________________

1 réponse

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
22 avril 2004 à 17:06
Pointlist.cpp:

Pointlis::Pointlist(){
LISTE = new Pointlist();
}

Ton constructeur par défaut de Pointlist est récursif!
0
Rejoignez-nous