[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;
}
A voir également:
- [C ++] Erreur de segmentation
- Erreur 3000 france tv - Forum Lecteurs et supports vidéo
- Erreur t32 ✓ - Forum Livebox
- Erreur upes 1025 - Forum Téléviseurs
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
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.
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 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à.
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à.
pour le suivant de p2 je lui affecte "le pointeur suiv de p1 avec la fonction milieu" ce qui correspond pour le premier tour du double boucle à B0 qui pointe lui vers B1"
est ce moi qui a mal coder???
ou bien que tu a mal compris??
bien cordialement