Se connecter / S'enregistrer
Votre question

[c++] trouver la ligne ou la segfault a lieu

Tags :
  • Programme
  • Programmation
Dernière réponse : dans Programmation
18 Mai 2006 20:11:10

Bonjour,

j'ai un problème très simple. j'utilise devcpp et j'ai une segfault à l'execution de mon programme. Est il possible de connaître l'instruction responsable de cette erreur? J'ai tenté d'utilisé le debugueur mais je ne m'en sors pas très bien.

De plus, mon erreur est étrange car je fais une boucle. Et à partir de 5 fois, ça plante. Par contre aucune erreur lorsque je la fais 1,2,3 ou 4 fois...

Merci par avance.

Autres pages sur : trouver ligne segfault lieu

18 Mai 2006 20:18:12

Citation :
Est il possible de connaître l'instruction responsable de cette erreur?

Possible (dans certains cas) mais pas toujours facile... Il faut prendre l'habitude d'utiliser un debugger... Avec une interface graphique c'est mieux.
Citation :
De plus, mon erreur est étrange car je fais une boucle. Et à partir de 5 fois, ça plante. Par contre aucune erreur lorsque je la fais 1,2,3 ou 4 fois...

Peut être un problème de tableau ou autre? Montres ton code pour voir...
18 Mai 2006 20:21:34

Humm, il fait 600 lignes et je pense qu'il est pas évident à lire...
Préviens moi si tu y tient qd même.
Contenus similaires
a b L Programmation
18 Mai 2006 20:50:14

Comme le dit Rakipu, c'est surement dû au remplissage d'un tableau: tu le remplis avec plus d'éléments que tu en a alloués, donc tu sors de la mémoire réservé de ton programme => pas content le programme d'écrire chez le voisin ;-)
18 Mai 2006 20:55:20

Hum...600 lignes... Ca fait un peu beaucoup... :lol: 

Lorsque tu as utilisé le debuguer qu'est ce qu'il t'as dit exactement?

A la limite montres juste la boucle qui pose problème... Ou alors envoie les sources du programme, que je puisse le compiler et utiliser gdb dessus... Pour pouvoir te répondre "ah ben non, je sais pas d'ou ca vient" :lol: 
18 Mai 2006 21:06:55

comment je peux envoyer mes sources?

Ceci dit faut aussi les librairies pour opengl gu32 glut32
donc c'est peut être un peu compliqué...
18 Mai 2006 21:20:46

Citation :
comment je peux envoyer mes sources?

Ben, avec un hébergeur internet... Ou avec des services d'upload...
http://www.filethatfile.com/
Tu le met dans un zip... J'ai jamais essayé, mais ca doit surement marcher!

Citation :
Ceci dit faut aussi les librairies pour opengl gu32 glut32

Ah ouais. En effet... Je ne les ai pas installé sur mon PC... D'ailleurs je suis très nul pour programmer avec OpenGLet glut, donc si le problème venait de là, je pourrais pas t'aider...
Ptet que en mettant un executable avec les sources ca marcherait...

Et sinon tu sais de quelle boucle ca vient?
a b L Programmation
18 Mai 2006 21:30:23

on a pas forcément besoin d'exécuter le programme pour savoir où est le problème. Montre nous silplement la boucle qui pose problème et la déclaration des variables utilisées dans cette boucle.-
18 Mai 2006 21:46:07

la boucle est super grosse...
par contre j'ai l'impression que l'erreur vient lors de l'appel de la méthode copier()
voici donc le résumé:

liste_fa1=new liste_face();
liste_fa2=new liste_face();
fa=new face(cpt0,cpt2,cpt1,0);
(*liste_fa1).ajouter(fa);

//la je fais une copie
(*liste_fa2).copier(liste_fa1);

et voici les classes concernées:
il faut surtout regarder les méthodes copier


class liste_face {
private:
vector<face*> liste_fa;
int taille;
public:
void ajouter(face * fa)
{
(*this).liste_fa.push_back(fa);(*this).taille++;
};
void changer(int n,face * fa){(*this).liste_fa[n]=fa;};
face * obt_fa(int n){return (*this).liste_fa[n];};
int obt_taille(){return (*this).taille;};
void copier(liste_face * liste_f)
{
int i,nbr;
nbr=(*this).liste_fa.size();
for(i=nbr-1;i>=0;i--)
{delete((*this).liste_fa);}(*this).liste_fa.clear();
for(i=0;i<(*liste_f).obt_taille();i++)
{
(*this).liste_fa.push_back(new face());
(*(*this).liste_fa).copier((*liste_f).obt_fa(i));
}
(*this).taille=(*liste_f).obt_taille();
}
liste_face(int taille=0){(*this).taille=taille;};
};


et

class face {
private: vector<int> liste_point;
point3d * vnormal;
int num;
public:
int obt_pt(int i){return (*this).liste_point;};
point3d * obt_n(){return (*this).vnormal;};
void changer(int n,int num_pt){(*this).liste_point[n]=num_pt;};
int obt_num(){return (*this).num;};
void copier(face * fa)
{
int i;
(*this).num=(*fa).obt_num();
delete((*this).vnormal);
(*this).vnormal=new point3d(1.0,1.0,1.0);
if((*this).liste_point.size()!=0){(*this).liste_point.clear();}
for(i=0;i<3;i++)
{(*this).liste_point.push_back((*fa).obt_pt(i));}
};
void changer_face(cpoint3d * pt1,cpoint3d * pt2,cpoint3d * pt3,int num)
{
float x1,x2,y1,y2,z1,z2;
(*this).num=num;
(*this).liste_point[0]=(*pt1).obt_num();
(*this).liste_point[1]=(*pt2).obt_num();
(*this).liste_point[2]=(*pt3).obt_num();
x1=(*(*pt2).obt_pt()).obtx()-(*(*pt1).obt_pt()).obtx();
x2=(*(*pt3).obt_pt()).obtx()-(*(*pt1).obt_pt()).obtx();
y1=(*(*pt2).obt_pt()).obty()-(*(*pt1).obt_pt()).obty();
y2=(*(*pt3).obt_pt()).obty()-(*(*pt1).obt_pt()).obty();
z1=(*(*pt2).obt_pt()).obtz()-(*(*pt1).obt_pt()).obtz();
z2=(*(*pt3).obt_pt()).obtz()-(*(*pt1).obt_pt()).obtz();
(*(*this).vnormal).valx(y1*z2-z1*y2);
(*(*this).vnormal).valy(z1*x2-x1*z2);
(*(*this).vnormal).valz(x1*y2-y1*x2);
};
face(){};
face(cpoint3d * cpt1,cpoint3d * cpt2,cpoint3d * cpt3,int num=0)
{
float x1,x2,y1,y2,z1,z2;
(*this).num=num;
(*this).liste_point.push_back((*cpt1).obt_num());
(*this).liste_point.push_back((*cpt2).obt_num());
(*this).liste_point.push_back((*cpt3).obt_num());
x1=(*(*cpt2).obt_pt()).obtx()-(*(*cpt1).obt_pt()).obtx();
x2=(*(*cpt3).obt_pt()).obtx()-(*(*cpt1).obt_pt()).obtx();
y1=(*(*cpt2).obt_pt()).obty()-(*(*cpt1).obt_pt()).obty();
y2=(*(*cpt3).obt_pt()).obty()-(*(*cpt1).obt_pt()).obty();
z1=(*(*cpt2).obt_pt()).obtz()-(*(*cpt1).obt_pt()).obtz();
z2=(*(*cpt3).obt_pt()).obtz()-(*(*cpt1).obt_pt()).obtz();
(*this).vnormal=new point3d();
(*(*this).vnormal).valx(y1*z2-z1*y2);
(*(*this).vnormal).valy(z1*x2-x1*z2);
(*(*this).vnormal).valz(x1*y2-y1*x2);
};
};

18 Mai 2006 22:15:20

arf j'ai trouvé mon pb...

c'est le delete dans la méthode copier de la class face.

Mais du coup je pense que certain delete se perdent. Comment peut on savoir si un pointeur a ete aloué ou non?
18 Mai 2006 22:44:53

Citation :
arf j'ai trouvé mon pb...

Super! Moi j'ai cherché, et j'ai pas trouvé...

Citation :
Comment peut on savoir si un pointeur a ete aloué ou non?

Pour une méthode au cas par cas tu peux les afficher.. Mais bon ca a vite ses limites :-P
Peut être en crééant une classe pointeur dont le constructeur obligerait à mettre une adresse dedans, ou mettrait une valeur abbérante mais reconaissable par défault... Enfin c'est une idée comme ca... J'ai jamais testé.
18 Mai 2006 23:47:25

Citation :
Comment peut on savoir si un pointeur a ete aloué ou non?

Lorsque tu déclares un pointeur il est toujours important de lui attribuer la valeur NULL (ou 0).Quand tu le désalloues il faut également le faire.
De cette façon tu es toujours en mesure de savoir si le pointeur a été alloué ou non.

PS: Je n'avais encore jamais vu quelqu'un manipuler les pointeurs comme toi : (*pointeur) pour manipuler les méthodes ou les attributs ... ça devient vite lourd je trouve ton code, mais c'est une question d'habitude j'imagine.
Je préfère
a->b->c
à
(*(*a).b).c
19 Mai 2006 06:58:23

bonne idée, l'histoire du pointeur NULL, je vais essayer.

Sinon pour les (*(*(*(* c'est juste que je trouve que ça fait moins "bricolage" que les -> mais les -> sont à mon avis bien plus simple et plus lisible. Je suis donc un peu borné la dessus... je changerai pe un jour...

merci pour vos réponses
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS