[C ++] Erreur de segmentation

Fermé
robert - 10 déc. 2006 à 15:09
 robert - 11 déc. 2006 à 20:35
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;


}

3 réponses

Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
11 déc. 2006 à 08:56
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.
0
salut a toi si en faite
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
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
11 déc. 2006 à 12:31
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.
0
ok je vois ce que tu veux dire mais au depart on part de 2 Cell donc comment pourrait on initialiser le troisième niveau?
quelle code propose tu?

je te remercie d'avance du temps que tu m'as accordé.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
11 déc. 2006 à 17:34
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à.
0
salu
en faite *(p2.suiv.suiv) vaut NULL puisque B1 a son pointeur qui pointe vers NULL
est ce moi qui a mal codé?? ou...
car Cell B1(gauss(),gauss(),1.); et
Cell(const double xx=0,const double yy=0,const doublett=0) :x1(xx),y1(yy),t1(tt),suiv(0){}

bonne soirée
0