[C ++] Erreur de segmentation
robert
-
robert -
robert -
salut j'ai un probleme sur les listes chainés : erreur de segmentation.... Pour les expert de math, je dois simuler un mouvement brownien...)Si quelqu'un peut m'aider sa serait tres sympa!!! je vou envoi le code ^^
#include <iomanip>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iomanip>
using namespace std;
// simulation de v.a.r. uniforme sur [0,1] :
inline double unif01() { return double( rand() )/RAND_MAX;}
// simulation approchee (Theorem Central Limit) de v.a.r.
// de loi gaussienne :
double gauss()
{
double g = - 6.0;
for ( int n = 0 ; n < 12 ; n++ )
g += unif01();
return g;
}
class Cell
{ double x1,y1,t1;
Cell *suiv;
public:
double x(){return x1;};
void x(double xx){x1=xx;};
double y(){return y1;};
void y(double yy){y1=yy;};
double t(){return t1;};
void t(double tt){t1=tt;};
Cell* sui(){return suiv;};
void sui(Cell* sui){suiv=sui;};
Cell(const double xx=0,const double yy=0,const double tt=0):x1(xx),y1(yy),t1(tt),suiv(0){}
virtual ~Cell(){delete []suiv;};
Cell(const Cell &c): x1(c.x1),y1(c.y1),t1(c.t1),suiv(c.suiv) { };
Cell&operator=(const Cell& c);
friend ostream&operator<<(ostream &,const Cell&);
Cell&milieu(Cell& c,Cell& d);
};
ostream&operator<<(ostream &sortie, Cell &c)
{
//for (int i=0;i<100;i++)
do
{
sortie <<c.x()<<" "<<c.y()<<" "<<endl;
c.x(c.sui()->x());
c.y(c.sui()->y());
c.t(c.sui()->t());
c.sui(c.sui()->sui());
} while(c.sui()!=0);
return sortie;
};
Cell&Cell::milieu( Cell& c, Cell& d)
{
double z=sqrt(((d.t())-(c.t())/4))*gauss();
x1=(c.x()+d.x())/2+(z);
y1=(c.y()+d.y())/2+(z);
t1=(c.t()+d.t())/2;
sui(c.sui());
return*this;
};
Cell&Cell::operator=(const Cell& c)
{
x1=c.x1;
y1=c.y1;
t1=c.t1;
suiv=c.suiv;
return *this;
};
main()
{
Cell B0(0.,0.,0.);
Cell B1(gauss(),gauss(),1.);
B0.sui(&B1);
const int n=2;
for(int i=1;i<2^n;i=i*2)
{
Cell *p1=new Cell;
Cell *p2=new Cell;
*p1=B0;
for(int j=0;j<i;j++)
{
(*p2).milieu(*p1,*(p1->sui()));
B0.sui(p2);
*p1=*(p2->sui());
}
} ;
/* do
cout<<B0<<endl;
}
#include <iomanip>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iomanip>
using namespace std;
// simulation de v.a.r. uniforme sur [0,1] :
inline double unif01() { return double( rand() )/RAND_MAX;}
// simulation approchee (Theorem Central Limit) de v.a.r.
// de loi gaussienne :
double gauss()
{
double g = - 6.0;
for ( int n = 0 ; n < 12 ; n++ )
g += unif01();
return g;
}
class Cell
{ double x1,y1,t1;
Cell *suiv;
public:
double x(){return x1;};
void x(double xx){x1=xx;};
double y(){return y1;};
void y(double yy){y1=yy;};
double t(){return t1;};
void t(double tt){t1=tt;};
Cell* sui(){return suiv;};
void sui(Cell* sui){suiv=sui;};
Cell(const double xx=0,const double yy=0,const double tt=0):x1(xx),y1(yy),t1(tt),suiv(0){}
virtual ~Cell(){delete []suiv;};
Cell(const Cell &c): x1(c.x1),y1(c.y1),t1(c.t1),suiv(c.suiv) { };
Cell&operator=(const Cell& c);
friend ostream&operator<<(ostream &,const Cell&);
Cell&milieu(Cell& c,Cell& d);
};
ostream&operator<<(ostream &sortie, Cell &c)
{
//for (int i=0;i<100;i++)
do
{
sortie <<c.x()<<" "<<c.y()<<" "<<endl;
c.x(c.sui()->x());
c.y(c.sui()->y());
c.t(c.sui()->t());
c.sui(c.sui()->sui());
} while(c.sui()!=0);
return sortie;
};
Cell&Cell::milieu( Cell& c, Cell& d)
{
double z=sqrt(((d.t())-(c.t())/4))*gauss();
x1=(c.x()+d.x())/2+(z);
y1=(c.y()+d.y())/2+(z);
t1=(c.t()+d.t())/2;
sui(c.sui());
return*this;
};
Cell&Cell::operator=(const Cell& c)
{
x1=c.x1;
y1=c.y1;
t1=c.t1;
suiv=c.suiv;
return *this;
};
main()
{
Cell B0(0.,0.,0.);
Cell B1(gauss(),gauss(),1.);
B0.sui(&B1);
const int n=2;
for(int i=1;i<2^n;i=i*2)
{
Cell *p1=new Cell;
Cell *p2=new Cell;
*p1=B0;
for(int j=0;j<i;j++)
{
(*p2).milieu(*p1,*(p1->sui()));
B0.sui(p2);
*p1=*(p2->sui());
}
} ;
/* do
cout<<B0<<endl;
}
3 réponses
-
Salut.
Sans être sur, je pense que ton pb vien de là:
*p1=*(p2->sui());
tu affecte à p1 le suivant de p2.
Mais le suivant du suivant de p2 n'est pas défini.
Donc lorsque tu appel le suivant de p1, il y a une erreur. -
je ne sais pas trop.
Je trouve toujours ça peut clair les listes Chainés. Il serait peut être mieux d'utiliser la STL.
Cell&Cell::milieu( Cell& c, Cell& d)
{
double z=sqrt(((d.t())-(c.t())/4))*gauss();
x1=(c.x()+d.x())/2+(z);
y1=(c.y()+d.y())/2+(z);
t1=(c.t()+d.t())/2;
sui(c.sui());//donc this->suiv=c.suiv equivalent d'ailleur à sui(d).
return*this;
};
en fait, p2.suiv.suiv n'est pas déclarer.
Donc lorsque tu fait p1=p2.suiv, p1.suiv n'est pas déclarer.(p1.suiv=p2.suiv.suiv suivant l'operateur =) {J'ai volontairement omi tous les *)
Je ne voi vraiment pas ou tu initialise le troisième niveau de ta liste. -
je n'ai pas bien compris ce que tu fait, donc je ne te propose rien. Par contre, je peu t'aider à comprendre l'erreur :
for(int j=0;j<i;j++)
{
(*p2).milieu(*p1,*(p1->sui()));
B0.sui(p2);
*p1=*(p2->sui());
}
supposons i>1
quand j=0, tu fait :
*p1=*(p2->sui());
ce qui veux dire que *(p1.suiv)=*(p2.suiv.suiv) ok?
or *(p2.suiv.suiv) n'est pas déclarer.
Dans la boucle "d'après" lorsque j=1,
(*p2).milieu(*p1,*(p1->sui()));
tu as un appel à p1.suiv qui n'est pas déclarer.
Je pense que l'erreur vien de là.