 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Florian Guest
|
Posted: Fri Mar 04, 2005 5:04 pm Post subject: Probleme de Segmentation Fault apres avoir executer deux foi |
|
|
Bonjour
J'ai un soucis,
mon code compile
cependant j'ai un gros soucis à l'éxecution
je l'execute 2 fois de suite ca marche sans probleme
mais au 3 eme lancements, il finit par un segmentation fault.
j'ai utilisé gdb et Kgdb il me dise bien ou est la segmentation fault
mais je ne vois pas ou!
Ca me lourde car je ne vois pas d'ou ca viens ca fait 5 jours que je
cherche et je ne vois pas d'ou ca viens.
Est ce que vous pouvez me dire qu'elle peut etre la raison de ce probleme?
je fille mon code pour montrée ce que je fait
Merci de m'aider
# AUTOMATIC UPDATE of dependencies (SunOS seulement)
..KEEP_STATE:
# nom de l'executable a creer
#
EXEC = evolution_souris
# noms des fichiers binaires necessaires pour creer $EXEC
#
OBJS = souris.o naissance.o appariement.o main.o ecriture_donee.o
# exemple plus complique:
# OBJS = slidemaker.o toto.o truc.o muche.o
###########################################
# compilateur C++
# NB: certaines configs utilisent la macro CXX, d'autres CCC
# => on initialise donc les deux
#
CXX= g++
CCC= ${CXX}
# options du compilateur C++
# NB1: meme remarque, il vaut mieux initialiser CXXFLAGS et CCFLAGS
# NB2: -g permet de debugger, -O optimise; -Wall affiche les erreurs
#
CXXFLAGS= -g
CCFLAGS= ${CXXFLAGS}
# options de l'editeur de liens
#
LDFLAGS=
# librairies a utiliser
#
LDLIBS=
# un exemple plus complique specifiant ou chercher les headers
# et les librairies necessaires pour l'edition de liens
#
# CXXFLAGS= -g -Wall -I/usr/local/qt/include
# CCFLAGS= ${CXXFLAGS}
# LDLIBS = -L/usr/local/qt/lib -lqt
##########################################
#
# Regles pour ce repertoire
default: $(EXEC)
$(EXEC): $(OBJS)
$(CCC) $(CCFLAGS) $(LDFLAGS) -o $@ $(OBJS) ${LDLIBS}
install:
-@cp -p -f $(EXEC) $(DESTBIN)
clean:
-@$(RM) $(EXEC) $(OBJS) core 1>/dev/null 2>&1
###########################################
#
# Regles implicites
..SUFFIXES: .cpp .cxx .cc .C .c
..cpp.o:
$(CXX) -w -c $(CXXFLAGS) $(INCPATH) -o $@ $<
..cxx.o:
$(CXX) -w -c $(CXXFLAGS) $(INCPATH) -o $@ $<
..cc.o:
$(CXX) -w -c $(CXXFLAGS) $(INCPATH) -o $@ $<
..C.o:
$(CXX) -w -c $(CXXFLAGS) $(INCPATH) -o $@ $<
..c.o:
$(CC) -w -c (CFLAGS) $(INCPATH) -o $@ $<
#titre
set title "evolution de la population de souris"
plot "nombre_souris.txt" using 1:2 title "souris male noir" with lines,
"nombre_souris.txt" using 1:3 title "souris femelle noir" with lines,
"nombre_souris.txt" using 1:4 title "souris mal blanche" with lines, "nombre_souris.txt" using 1:5 title "souris femelle blanche" with lines,
"nombre_souris.txt" using 1:6 title "souris mal grise" with lines, "nombre_souris.txt" using 1:7 title "souris mal grise" with lines
pause -1
plot "nombre_souris.txt" using 1:8 title "nombre de souris total" with lines
pause -1
set title "evolution de la population de souris"
plot "nombre_souris.txt" using 1:9 title "% souris noir" with lines,
"nombre_souris.txt" using 1:10 title "% souris blanche" with lines,
"nombre_souris.txt" using 1:11 title "% souris grise" with lines
pause -1
|
|
| Back to top |
|
 |
Ahmed MOHAMED ALI Guest
|
Posted: Mon Mar 07, 2005 11:58 am Post subject: Re: Probleme de Segmentation Fault apres avoir executer deux |
|
|
Salut,
A mon avis,ton problème vient du pointeur renvoyé par getConjoint() qui ne
désigne pas forcément une adresse correcte (en tout cas,je ne vois pas ce
qui le garanti dans ton code) de plus tu ne le testes même pas.
Initialise le membre conjoint de souris dans le constructeur
souris::souris(int S,int C): conjoint(0) { ...}
Partout où tu utilises getConjoint() compare le pointeur renvoyé à 0 avant
de le déréférencer.Fais de même avec tous les pointeurs que tu utilises dans
ton code.
J'espère que cela t'aidera à résoudre ton bug.
Ahmed MOHAMED ALI
"Florian" <florian.morineau2 (AT) 9online (DOT) fr> wrote
| Quote: | Bonjour
J'ai un soucis,
mon code compile
cependant j'ai un gros soucis à l'éxecution
je l'execute 2 fois de suite ca marche sans probleme
mais au 3 eme lancements, il finit par un segmentation fault.
j'ai utilisé gdb et Kgdb il me dise bien ou est la segmentation fault
mais je ne vois pas ou!
Ca me lourde car je ne vois pas d'ou ca viens ca fait 5 jours que je
cherche et je ne vois pas d'ou ca viens.
Est ce que vous pouvez me dire qu'elle peut etre la raison de ce probleme?
je fille mon code pour montrée ce que je fait
Merci de m'aider
|
----------------------------------------------------------------------------
----
| Quote: |
# AUTOMATIC UPDATE of dependencies (SunOS seulement)
.KEEP_STATE:
# nom de l'executable a creer
#
EXEC = evolution_souris
# noms des fichiers binaires necessaires pour creer $EXEC
#
OBJS = souris.o naissance.o appariement.o main.o ecriture_donee.o
# exemple plus complique:
# OBJS = slidemaker.o toto.o truc.o muche.o
###########################################
# compilateur C++
# NB: certaines configs utilisent la macro CXX, d'autres CCC
# => on initialise donc les deux
#
CXX= g++
CCC= ${CXX}
# options du compilateur C++
# NB1: meme remarque, il vaut mieux initialiser CXXFLAGS et CCFLAGS
# NB2: -g permet de debugger, -O optimise; -Wall affiche les erreurs
#
CXXFLAGS= -g
CCFLAGS= ${CXXFLAGS}
# options de l'editeur de liens
#
LDFLAGS=
# librairies a utiliser
#
LDLIBS=
# un exemple plus complique specifiant ou chercher les headers
# et les librairies necessaires pour l'edition de liens
#
# CXXFLAGS= -g -Wall -I/usr/local/qt/include
# CCFLAGS= ${CXXFLAGS}
# LDLIBS = -L/usr/local/qt/lib -lqt
##########################################
#
# Regles pour ce repertoire
default: $(EXEC)
$(EXEC): $(OBJS)
$(CCC) $(CCFLAGS) $(LDFLAGS) -o $@ $(OBJS) ${LDLIBS}
install:
-@cp -p -f $(EXEC) $(DESTBIN)
clean:
-@$(RM) $(EXEC) $(OBJS) core 1>/dev/null 2>&1
###########################################
#
# Regles implicites
.SUFFIXES: .cpp .cxx .cc .C .c
.cpp.o:
$(CXX) -w -c $(CXXFLAGS) $(INCPATH) -o $@ $
.cxx.o:
$(CXX) -w -c $(CXXFLAGS) $(INCPATH) -o $@ $
.cc.o:
$(CXX) -w -c $(CXXFLAGS) $(INCPATH) -o $@ $
.C.o:
$(CXX) -w -c $(CXXFLAGS) $(INCPATH) -o $@ $
.c.o:
$(CC) -w -c (CFLAGS) $(INCPATH) -o $@ $
|
----------------------------------------------------------------------------
----
| Quote: | #include"appariement.h"
int trouve_mal_non_apparier(vector<souris> SM)
{
for(int i=0;i<SM.size();i++)
{
if (SM.at(i).iscouple()==0) return(i);
}
return(-1);
}
void apparier(vector
{
int i;
int j;
j=(int)rand()%SM.size();
for(i=0;i<SF.size();i++)
{
j=trouve_mal_non_apparier(SM);
if(j!=-1)
{
mal_cherche_femmelle(SM.at(j),SF.at(i));
}
}
}
void creationcouple(souris &S1,souris &S2)
{
S1.couple(S2);
S2.couple(S1);
};
void mal_cherche_femmelle(souris &M,souris &F)
{
int k;
// int it=0;
// chercher si les hommes sont en en couple,
//si il ne sont pas en couple, si l'age est >5 mois, il peut rechercher
une femme dans le vecteur de femmes qui ne soit pas en couple et que l'age |
est >5 mois.
| Quote: |
if(M.getage()>20)
{ // chaque fois qu'un homme n'a pas de conjoint il cherche une
femelle non apparié
if(M.iscouple()==0)
{
if(F.getage()>20)
{
creationcouple(F,M);
F.nest_plus_gestation();
}
}
}
// parcourir le tableau d'homme
}
|
----------------------------------------------------------------------------
----
| Quote: | #include"souris.h"
#include<vector.h
int trouve_mal_non_apparier(vector
void apparier(vector<souris>&,vector<souris>&);
void creationcouple(souris &,souris &);
void mal_cherche_femmelle(souris &,souris &);
|
----------------------------------------------------------------------------
----
| Quote: | #include"ecriture_donee.h"
int compatage_souris(vector<souris> Sou,int Couleur)
{
int i,j=0;
for (i=0;i<Sou.size();i++)
if(Sou.at(i).getcoul()==Couleur)// && (Sou.at(i).is_not_mort()==0));
{
if(Sou.at(i).is_not_mort()==0)
{
j++;
}
}
return(j);
}
int comtages_souris_mort(vector
{
int i,j=0;
for(i=0;i<Sou.size();i++)
{
if(Sou.at(i).is_not_mort()==1)
{
j++;
}
}
return(j);
}
void ecrire_fichier(ofstream &fichier,vector
temps)
{
int k=compatage_souris(M,0)+compatage_souris(F,0)+compatage_souris(M,1)+
compatage_souris(F,1)+compatage_souris(M,2)+compatage_souris(F,2);
float m= comtages_souris_mort(M)+ comtages_souris_mort(F);
fichier <
" "<
" "<
" "<
fichier<<" "<<(compatage_souris(M,0)+compatage_souris(F,0))*100/k;
fichier<<" "<<(compatage_souris(M,1)+compatage_souris(F,1))*100/k;
fichier<<" "<<(compatage_souris(M,2)+compatage_souris(F,2))*100/k;
fichier<<" "<
cout<
" "<
" "<
cout<<" "<<(float)(compatage_souris(M,0)+compatage_souris(F,0))*100.0/k;
cout<<" "<<(float)(compatage_souris(M,1)+compatage_souris(F,1))*100.0/k;
cout<<"
"<<(float)(compatage_souris(M,2)+compatage_souris(F,2))*100.0/k<<" |
"<
----------------------------------------------------------------------------
----
| Quote: | #include"souris.h"
#include
#include
int compatage_souris(vector
int comtages_souris_mort(vector<souris>);
void ecrire_fichier(ofstream &,vector<souris>,vector<souris>,int);
|
----------------------------------------------------------------------------
----
| Quote: | #titre
set title "evolution de la population de souris"
plot "nombre_souris.txt" using 1:2 title "souris male noir" with lines,
"nombre_souris.txt" using 1:3 title "souris femelle noir" with lines,
"nombre_souris.txt" using 1:4 title "souris mal blanche" with lines,
"nombre_souris.txt" using 1:5 title "souris femelle blanche" with lines,
"nombre_souris.txt" using 1:6 title "souris mal grise" with lines,
"nombre_souris.txt" using 1:7 title "souris mal grise" with lines
pause -1
plot "nombre_souris.txt" using 1:8 title "nombre de souris total" with
lines
pause -1
set title "evolution de la population de souris"
plot "nombre_souris.txt" using 1:9 title "% souris noir" with lines,
"nombre_souris.txt" using 1:10 title "% souris blanche" with lines,
"nombre_souris.txt" using 1:11 title "% souris grise" with lines
pause -1
|
----------------------------------------------------------------------------
----
| Quote: | #include "naissance.h"
#include "appariement.h"
#include "ecriture_donee.h"
int main(void)
{
srand(time(NULL));
vector<souris> SM;
vector<souris> SF;
int t=0,i=0,j=0,t3;
vector<souris> P;
ofstream resultat("nombre_souris.txt",ios::out|ios::binary);
// definir un vecteur de souris mal
//definir un vecteur de souris femelle
souris SM1(0,0);
souris SF1(1,0);
SM.push_back(SM1);
SF.push_back(SF1);
souris SM2 (1,1);
souris SF2(0,1);
// fonction de recherche de souris
// fontion de naissance d'une porté souris
SM.push_back(SM2);
SF.push_back(SF2);
for(t=0;t<=128;t++)
{
apparier(SF,SM);
toutes_les_souris_naissances(SF,SM);
age_plus(SF);
age_plus(SM);
t3=t%12;
if((t3==0 && t!=0) || t==128 )
{
ecrire_fichier(resultat,SF,SM,t);
}
}
system("gnuplot evolution.gnu");
// boucle qui fait des enfants
resultat.close();
}
|
----------------------------------------------------------------------------
----
| Quote: | #include "naissance.h"
vector
{
vector <souris> Port;
souris *conj;
conj=F.getconjoint();
int k=(int)rand()%3+5;
for(int i=0;i<k;i++)
{
// cout<<"valeur de est en couple "<
souris
E(F.gencouleur,F.getconjoint()->gencouleur,F,*F.getconjoint());
Port.push_back(E);
}
// cette fonction renvoi une porté d'une sourie femmelle, tirage
aléatoire d'une nombre d'enfant de la porté
//et elle tire au hasart et scanne un nombre de femme qui va procree
//elle crée les souris enfant qu'elle mets dans une portée
return(Port);
};
void naissance(vector<souris> &Femelle, vector<souris
&Male,vector
{
for (int i=0;i<E.size();i++)
{
if(E[i].getsex()==1)
{
Femelle.push_back(E.at(i));
}
else if (E[i].getsex()==0)
{
Male.push_back(E.at(i));
}
}
}
// naissance de tous les enfants de chaques femmes qui peut mettre bas
void toutes_les_souris_naissances(vector
&Male)
{
vector
int i;
int taille_vect_F=Femelle.size();
for(i=0;i< taille_vect_F ;i++)
{
if(
(Femelle.at(i).getage()==20)||(Femelle.at(i).get_age_gest()==11))
{
Femelle.at(i).nest_plus_gestation();
}
if ((Femelle.at(i).iscouple()==1) && (Femelle.at(i).getgestation()==0))
{
if(Femelle.at(i).is_not_mort()==0)
{
cout<<" souris "<
Port=porte(Femelle.at(i));
naissance(Femelle,Male,Port);
Femelle.at(i).en_gestation();
//réecrire naissance pour pouvoir scanné le vecteur de vecteur
}
}
}
}
void age_plus(vector
{
for(int i=0;i<S.size();i++)
{
S.at(i).ageplus();
}
};
|
----------------------------------------------------------------------------
----
| Quote: | #include
#include "souris.h"
#include
void naissance(vector
void toutes_les_souris_naissances(vector<souris> &, vector<souris> &);
void age_plus(vector<souris>&);
|
----------------------------------------------------------------------------
----
| Quote: |
#include "souris.h"
souris ::souris(int S,int C)
{
sex=S; // 0 mal et 1 femelle
couleur=C; // 0 noir 1 blanc 2 gris
gencouleur[0]=C, gencouleur[1]=C;
age=0; // initialisation de l'age a 0 jours
mort=0;// vie =0 et mort =1
pere=NULL;
mere=NULL;
gest=-1;
durgest=0;
}
// construction d'une souris pour la naissance de souris
souris::souris(int Pe[2],int Me[2],souris &P, souris &M)
{
// naissance a -21 jours début de la porté
age=-3;
mort=0;
durgest=0;
gest=-1;
float x=((float)rand()/(RAND_MAX));
float y=((float)rand()/(RAND_MAX));
// tirage aléatoire du sex et de la couleur
if (x<0.5 && y<0.5)
{
gencouleur[0]=Pe[0];
gencouleur[1]=Me[0];
couleur=2;
}
else if (x<0.5 && y>0.5)
{
gencouleur[0]=Pe[0];
gencouleur[1]=Me[1];
couleur=Pe[0];
}
else if(x>0.5 && y<0.5)
{
gencouleur[0]=Me[0];
gencouleur[1]=Pe[1];
couleur=Me[0];
}
else
{
gencouleur[0]=Pe[1];
gencouleur[1]=Me[1];
couleur=2;
}
if ( x<0.5)
{sex=0;}
if (x>=0.5)
{sex=1;};
pere=&P;
mere=&M;
};
//methode
int souris::ageplus()
{
if (mort==0)
{
age=age+1;
if(gest==1)
{
durgest++;
}
}
mourir();
};
int souris::getcoul()
{
return(couleur);
}
void souris::couple(souris &M)
{
if(age>=20)
{
apariement=1;
conjoint=&M;
}
};
// cette méthode vérifie si la souris est en couple
int souris::iscouple()
{
if ( apariement==1) return(1);
return(0);
};
int souris::getgestation()
{
return(gest);
}
void souris::en_gestation()
{
gest=1;
//regarder dans le projet la duré de la gestation et à partir de quand
elle peut refaire une porté
}
void souris::nest_plus_gestation()
{
gest=0;
}
void souris::mourir()
{
if (age==72)
{
mort=1;
}
}
int souris::getage()
{
return(age);
};
int souris::getsex()
{
return(sex);
};
int souris::get_age_gest()
{
return(durgest);
}
int souris::ispere(souris &S)
{
if(pere == &S) return(true);
return(false);
};
int souris::ismere(souris &S)
{
if(mere == &S) return(1);
return(0);
};
// int souris::isconjoint(souris &S)
// {
// if(conjoint == &S) return(1);
// return(0);
// };
souris* souris::getconjoint()
{
return(conjoint);
};
int souris::is_not_mort()
{
return(mort);
}
|
----------------------------------------------------------------------------
----
| Quote: | #ifndef souris_h
#define souris_h
#include
#include
#include
class souris
{
private :
int sex;
int couleur;
// age en semaine
int age;
int mort;
int apariement;
// gestation definit si la souris Femmelle peut faire ou pas des enfants
// si Ok 0 et Non 1
int gest;
int durgest;
souris *mere;
souris *pere;
souris *conjoint;
public :
int gencouleur[2];
souris();
souris(int,int);
souris(int*,int*,souris&, souris&);
~souris(){};
void couple(souris&);
void mourir();
int getgestation();
void changestategestation();
int iscouple();
int ageplus();
int getage();
int get_age_gest();
int is_not_mort();
void nest_plus_gestation();
void en_gestation();
// methode le la souris à couplé en dessout
int getsex();
int getcoul();
int ispere(souris&);
int ismere(souris&);
int isconjoint(souris&);
souris* getconjoint();
};
#endif
|
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|