Accueil > Forum > > > > erreur de segmentation (segfault) dans une fonction vide
erreur de segmentation (segfault) dans une fonction vide
dimanche 17 avril 2011 à 20:45:33 |
erreur de segmentation (segfault) dans une fonction vide

tiouil
|
Bonjour, j'ai une erreur de segmentation lorsque je fait appel a une fonction vide (  ) via un pointeur. Si quelqu'un peut m'aider ^^.
Pour le contexte, je suis au debut d'un logiciel qui va avoir acces à une base de données sous linux.
J'utilise une architecture modele/vue (pas de controleur).
Je ne vous met pas le code de la vue car cela ne sert pas. Elle sert juste d'interface utilisateur et change le modele via les accesseur (type de la personne, choix...).
Le debuggeur gdb m'affiche une erreur a l'appel de secretaire ou responsable sur le menu1 car pour l'instant a part lui et le menu general il n'y a pas grand chose (depend du choix de l'utilisateur)
//ArchiModele.cc
Code C/C++ :
#include "ArchiModel.h"
#include "Personne.h"
#include "Secretaire.h"
#include "Responsable.h"
#include <string.h>
#include <iostream>
#include <cstdlib>
using namespace std;
/****************************************
Constructeur
****************************************/
ArchiModel::ArchiModel() : _w(800), _h(600)
{
_type = ttlm;
_count_delete = 0;
_menu = mg;
_choix = rien;
_responsable = new Responsable();
_secretaire = new Secretaire();
}
ArchiModel::ArchiModel(int w, int h) : _w(w), _h(h)
{
}
/****************************************
Destructeur
****************************************/
ArchiModel::~ArchiModel()
{
if(_count_delete < 1) //le modele fait appel au destr de resp et secre, si on ne met pas cela, quand archiVue fait delete _model, il on le refait -> erreur
{
if(_responsable != NULL)
delete _responsable;
if(_secretaire != NULL)
delete _secretaire;
_count_delete++;
}
}
/****************************************
Accesseurs en lecture
****************************************/
string ArchiModel::getType()
{
switch (_type) // "break" n'est pas utile car return stop la fonction
{
case ttlm :
{
return "ttlm";
}
case responsable :
{
return "responsable";
}
case secretaire :
{
return "secretaire";
}
default :
{
abort(); //on quitte il y a une erreur
}
}
}
string ArchiModel::getIdMenu()
{
switch (_menu) // "break" n'est pas utile car return stop la fonction
{
case mg :
{
return "menu_general";
}
case m1 :
{
return "menu_1";
}
case m2:
{
return "menu_2";
}
default :
{
return "menu_general"; //On revient au menu general car erreur
}
}
}
/****************************************
Accesseurs en ecriture
****************************************/
void ArchiModel::setChoix(string choix)
{
if(_menu == mg)
{
if(choix == "choix_1")
{
_type = responsable;
}
else
_type = secretaire;
}
else if(choix == "choix_2")
_choix = c2;
else if(choix == "choix_3")
_choix = c3;
else if(choix == "choix_4")
_choix = c4;
}
/*void ArchiModel::setType(string pers)
{
if(pers == "secretaire")
_type = secretaire;
else if(pers == "responsable")
_type = responsable;
else
_type = ttlm;
}*/
void ArchiModel::setIdMenu(string que_fait_on)
{
switch (_menu) // "break" n'est pas utile car return stop la fonction
{
case mg :
{
if(que_fait_on == "+")
_menu = m1;
break;
}
case m1 :
{
if(que_fait_on == "+") //confirmer -> on va au menu suivant
_menu = m2;
if(que_fait_on == "-") //retour -> on va au menu precedent
_menu = mg;
else //menu -> on retourne au menu general
_menu = mg;
break;
}
case m2:
{
/*if(que_fait_on == "+") //Plus de menu suivant on fait l'action demande DANS UNE NOUVELLE FENETRE
_menu = m3;*/
if(que_fait_on == "-")
_menu = m1;
else
_menu = mg;
break;
}
default :
{
_menu = mg; //On revient au menu general car erreur
break;
}
}
}
/****************************************
Prochaine etape
****************************************/
void ArchiModel::nextStep()
{
switch (_type)
{
case responsable :
{
if(_menu == m1)
{
_responsable->menu1();[color=orange]//Erreur de seg[/color]
}
else if(_menu == m2)
{
_responsable->menu2();
}
break;
}
case secretaire :
{
if(_menu == m1)
{
_secretaire->menu1(); [color=orange]//Erreur de seg[/color]
}
else if(_menu == m2)
{
_secretaire->menu2();
}
break;
}
default : //ttlm
{
_menu = mg;
break;
}
}
}
//Personne.cc
Code C/C++ :
#include "Personne.h"
using namespace std;
/****************************************
Constructeur
****************************************/
Personne::Personne()
{
}
/****************************************
Destructeur
****************************************/
Personne::~Personne()
{
}
//Personne.h
Code C/C++ :
#ifndef _PERSONNE_
#define _PERSONNE_
class Personne{
public:
Personne();
virtual ~Personne();
virtual void menu1() = 0; //methode abstraite
virtual void menu2() = 0; // idem
};
#endif
//Secretaire.cc
Code C/C++ :
#include "Secretaire.h"
#include <iostream>
#include <cstdlib>
using namespace std;
/****************************************
Constructeur
****************************************/
Secretaire::Secretaire()
{
}
/****************************************
Destructeur
****************************************/
Secretaire::~Secretaire()
{
}
/****************************************
Menus de la secretaire
****************************************/
void Secretaire::menu1()
{
cout<<"menu1 secr"<<endl;
}
void Secretaire::menu2()
{
cout<<"menu1 secr"<<endl;
}
//Secretaire.h
Code C/C++ :
#ifndef _SECRETAIRE_
#define _SECRETAIRE_
#include "Personne.h"
class Secretaire : public Personne
{
public:
Secretaire();
~Secretaire();
virtual void menu1();
virtual void menu2();
};
#endif
ps : secretaire et responsable sot identiques pour le moment donc je ne vous met que secretaire.
Merci par avance pour votre patience.
Cyril Z.
|
|
lundi 18 avril 2011 à 08:32:43 |
Re : erreur de segmentation (segfault) dans une fonction vide

fregolo52
|
Réponse acceptée !
Je ne sais un grand pro du C++, mais :
Personne a des méthodes virtuelles pures, ok !
virtual void menu1() = 0; //methode abstraite
Seccretaire doit l'implémenter :
void menu1();
|
|
lundi 18 avril 2011 à 11:10:33 |
Re : erreur de segmentation (segfault) dans une fonction vide

tiouil
|
Bonjour, je sais mais justement j'ai ajouté un cout<<, donc meme si je travail avec la sfml, comme j'ouvre mon terminal pour lancé ma .exe, il devrait me l'affichait or il n'affiche meme pas le cout<<. J'en conclu donc que c'est au moment de l'appel comme le debuggeur mais pourquoi.
Je me sers du polymorphisme et je respecte les regles, methode abstraire = redefinition de classe fille avec meme prototype -> c'est OK, appel avec un pointeur donc il differencie bien les deux classes (secretaire, responsable).
HELP!!!!!!
Si tu as une autre idée n'hesites pas, merci
Cyril Z.
|
|
lundi 18 avril 2011 à 11:12:17 |
Re : erreur de segmentation (segfault) dans une fonction vide

tiouil
|
J'ai oublié de te dire qu'en enlevant virtual de secretaire et de responsable ca marche toujours pas. (D'ailleur j'ai d'abord essayer cette solution mais en me balladant sur les forums j'ai trouvé ca)
Cyril Z.
|
|
lundi 18 avril 2011 à 19:10:14 |
Re : erreur de segmentation (segfault) dans une fonction vide

CptPingu
|
Poste un exemple complet qui compile, et je te le débuggerais/améliorerais :)
(J'ai abandonné en essayant de refaire ton "ArchiModele.h", un peu chiant à faire).
Premières remarques:
- Évite les "using namespace", voir: [ Lien ]
- N'utilise pas NULL, voir: [ Lien ]
- Inutile de vérifier si un pointeur est null avant de faire un "delete". Delete vérifie déjà cela, et ne fais rien. Ex: delete 0, est tout à fait valide et ne fait rien.
- Avoir de l'héritage et faire ensuite un switch case... Y a un gros problème de conception.
- Des strings et des chars à la place des enums ? Oo
- Nomme tes headers .hh, .h c'est pour le C. (Généralement on a l'un des couples suivants: .hh/.cc, .hpp/.cpp).
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
lundi 18 avril 2011 à 20:25:35 |
Re : erreur de segmentation (segfault) dans une fonction vide

tiouil
|
Bonjour, je suis etudiant en info et nos profs nous on appris certaines choses et l'utilisent eux memes (se sont des enseignants chercheurs au labri donc je ne me fait pas de soucis ^^) :
- pour les usings cela vient d'eux et dans une autoformation il l'on utilisé (debut de notre code pour le sujet)
- pour la verificaétion des deletes c'est pareil c'est "leur code" que j'ai adapté.
- de meme pour le nom des fichiers pour nous et pour eux (meme lors TD et TP) c'est .cc et .h, autrement dit il ne veulent sans doute pas que l'on utilise .hh
Sinon, qu'entends tu par chars et string a la place des enums ? et par switch case dans l'heritage ?
Et encore, j'ai resolu l'erreur de seg en faisant sauter la classe personne et en renommant differemment le nom des fonctions de secretare et responsable car apres tout elles n'auront pas de fonction en commum etant donnée que je vais leur donnée un nom suivant leur action (ajout BD, suppr, test.....). -> mise a part peut-etre une en commun mais bon ..... je m'arrangerais.
Pour finir as tu un bon cours sur le polymorphisme car l'erreur venait de la, meme si cela n'est pas la bonne reponse :
[quote]
Je ne sais un grand pro du C++, mais :
Personne a des méthodes virtuelles pures, ok !
virtual void menu1() = 0; //methode abstraite
Seccretaire doit l'implémenter :
void menu1();
[quote]
Merci encre a vous deux !!!
Cyril Z.
|
|
lundi 18 avril 2011 à 20:59:33 |
Re : erreur de segmentation (segfault) dans une fonction vide

CptPingu
|
se sont des enseignants chercheurs
Ce n'est malheureusement pas toujours un gage de qualité...
J'ai aussi bossé avec des enseignants chercheurs (qui bossait à mi-temps à Polytechnique et/ou à l'Inria, si vraiment il faut jouer la dessus), et la première chose que l'on a appris, c'est pas de using namespace et pourquoi (et par quoi le remplacer si nécessaire, ou tout du moins l'utiliser correctement si on insiste. Cf l'article dont j'ai mis le lien).
- pour les usings cela vient d'eux et dans une autoformation il l'on utilisé (debut de notre code pour le sujet)
C'est une connerie. Et malheureusement, c'est à cause de gens comme eux, qu'on se retrouve en entreprise avec des conflits de namespace à s'arracher les cheveux.
- pour la verificaétion des deletes c'est pareil c'est "leur code" que j'ai adapté.
Ils ne savent pas que delete 0, ne fait rien ? Pour le coup je suis super étonné de la part de ces enseignants. (Sauf s'ils me répondent: on utilise pas de delete, on a des smart pointers, donc plus l'habitude).
- de meme pour le nom des fichiers pour nous et pour eux (meme lors TD et TP) c'est .cc et .h, autrement dit il ne veulent sans doute pas que l'on utilise .hh
C'est une simple convention. Ça ne change rien. Maintenant, regarde la bibliothèque Boost, tu verras qu'il n'y a pas de .h (Boost est LA bibliothèque la plus évoluée en C++, à tel point que des morceaux de celle-ci sont incorporés à la nouvelle version du C++, le C++0X).
PS: Juste par curiosité, c'est quoi ton école ? Ne réponds pas en public, répond juste par message personnel.
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
lundi 18 avril 2011 à 22:29:32 |
Re : erreur de segmentation (segfault) dans une fonction vide
|
mardi 19 avril 2011 à 10:41:13 |
Re : erreur de segmentation (segfault) dans une fonction vide

tiouil
|
Bonjour, patalo (mon idole de visual c++ 2008 ^^), ta reponse me parait bien, mais ..... qu'est ce que la "reinterpretation de la caste" ?
Sinon pour "cptPingu", tu m'as convaincu mais je n'ai pas le temps de revoir entierement mais deux projets, de plus je ne connais pas les fonctions faisant partie de la std a part le "cout<<".
Par contre pour le delete je le fais immediatement
Merci a vous deux !!!
Cyril Z.
|
|
mardi 19 avril 2011 à 10:49:30 |
Re : erreur de segmentation (segfault) dans une fonction vide

CptPingu
|
@patatalo: Techniquement, c'est juste. Mais au niveau conception, c'est un "workaround", une astuce pour contourner rapidement une erreur de conception à la base. Normalement, s'il utilise "Personne", il doit avoir une méthode héritée par ses fils qui est appelée automatiquement, et donc il n'est pas nécessaire de faire un cast. En revanche, il y a effectivement des cas où on ne peut faire autrement, je suis d'accord avec toi. Ici, on peut heureusement l'éviter.
@tiouil
Par contre pour le delete je le fais immediatement
Tu peux éviter le delete dans certains cas. Ici, tu fais un "new Objet" dans le constructeur et un "delete Objet" dans le destructeur.
Tu peux tout simplement avoir un "Objet" en attribut, au lieu d'avoir un "Objet*". Et la plus besoin de new, ni de delete (Et ça reviens strictement au même, l'objet étant détruit automatiquement à la destruction de son possesseur).
Le mieux c'est que tu me postes un code qui compile, que je puisse t'apporter mon aide correctement :)
________________________________________________________________________
Historique de mes créations, et quelques articles:
http://0217021.free.fr/portfolio
Merci d'utiliser Réponse acceptée si un post répond à votre question
|
|
Cette discussion est classée dans : menu, choix, responsable, if, secretaire
Répondre à ce message
Sujets en rapport avec ce message
menu en batch [ par tieu63 ]
Bonsoir; Je me met au batch (pour le boulo!) je n'en ai jamais fais auparavant... J'ai fait un petit bou de code pour automatisé quelques taches sous
Ecrire dans un fichier [ par pitidragon ]
Bonjour !Je viens vous demandez de l'aide pour un programme en C. J'ai réalisé un démineur, jouable sur console, et je dois rajouter une fonction mais
[C] Retour au début du programme [ par thekid06 ]
Bonsoir, Je cherche après chaque execution revenir au début du programme. Comment je peut faire s'il vous plaît ? Voilà ma source : [code=cpp]#includ
un menu avec des controles d'erreur de saisie [ par valveur ]
Bonjour, Voila mon simple programme, le problème est sur la saisie du choix: Si je tape une lettre mon programme ne s'arrête pas. Est ce que mon excep
Problème de débutant ... [ par thedivxboy ]
Bonjour, je suis en train d'apprendre le C en bacalauréat mais comme les élèves et les profs ne vont pas assez vite pour moi, je m'entraîne à faire de
retourner un const wxString[] ! [ par georgeduke ]
Voilà mon problème : Pour alimenter les différents éléments qu'un wxCombobox devra afficher, j'ai besoin d'indiquer à ce dernier un wxString[]. Pour
Aide pour mastermind [ par Giuventine ]
Bonjour à tous, Je débute en programmation et dans le cadre du cours je dois réaliser un projet qui est le Mastermind en C. Pour cela, j'ai conçu u
liste chainée [ par floralastar03 ]
Bonjour à tousj'ai résolu mon problème d'hier en suivant vos conseils, mais il en reste toujours un. j'ai modifié ma procédure de création de liste, t
menu en c [ par sebz10 ]
bonjour, je voudrais créer un menu en c de façon a ce que quand je selectione un proposition (ex: addition) je puisse en suite additions ou tonber dan
Livres en rapport
|
Derniers Blogs
JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|