wxDev.fr, le portail francophone consacré à wxWidgets ! ( The french portal for wxWidgets )  
Esp. membre
Recheche rapide



Recherche avancée
Statistiques
Membres inscrits :2359

Membres en ligne : 0
Invités en ligne : 3

Valid XHTML 1.0 Transitional

Valid CSS2

Menu forum (navigation):
Pages: 1 Discussion fermée
 
Accueil » Accueil forums » Développement C/C++
» Segmentation Fault.....
Conversation (Résolue) : Segmentation Fault.....
23-11-2008 08:16:07  Segmentation Fault..... #1
wxDidier (Membre)
Inscrit le : 14-09-2008
Messages: 24
Snippets: 0
Tutoriels: 0
Hors ligne
Bonjour,


J'ai une Segmentation Fault sur un programme wxWidgets.

Je sais où se trouve la ligne posant problème mais je ne sais pas comment corriger l'erreur.

Le principe est le suivant:

J'ai 2 class distinctes.

Une class MainWin instanciée dans la partie init du programme.
    MainWin *win = new MainWin();
        win->Show(true);

Une class Dice pour une autre fenêtre

Code:

 
class Dice:public wxFrame
{
 
    public:
    Dice();
 
    MainWin *ptr_vers_win; <<< je declare ma class MainWin via le pointeur
 
etc.....
};
 

Code:

 
void MainWin::OnRoll(wxCommandEvent &Event)
{
    RollDice = new Dice();
    RollDice->Show(true);
    RollDice->ptr_vers_win=this; <<<< j'initialise le pointeur
}
 

dans le constructeur

Code:

 
Dice::Dice():wxFrame(NULL,-1,wxT("Action !"),wxDefaultPosition,wxSize(550,480))
{
......
 
    ptr_vers_win->PersIni->SetPath(wxT("/")); <<<< Segmentation fault ici !
........
}
 
 

Il n'y a pas de problème a la compilation mais dès que j'essaye d'accéder a un élément de la class MainWin. ça plante.
Est ce la bonne démarche ?
N'ayant pas des bases C/C++ très solide je ne sais pas comment corriger cette erreur, je comprends qu'il y a un problème d'écriture ou lecture vers une zone mémoire mais......
23-11-2008 15:05:26  Re: Segmentation Fault..... #2
4ian (Membre)
Inscrit le : 06-11-2007
Messages: 48
Snippets: 0
Tutoriels: 0
Site web
Hors ligne
Dans le constructeur, tu met ceci ( j'ai vite fait retouché ton code ) :

Code cpp:

 
Dice::Dice():wxFrame(NULL,-1,wxT("Action !"),wxDefaultPosition,wxSize(550,480))
{
    /*...*/
    ptr_vers_win->PersIni->SetPath(wxT("/")); //Segmentation fault ici !
    /*...*/
}
 
 


Il faut donc que ton pointeur soit initialisé.
Mais quand tu créé ta fenêtre, il n'est pas initialisé

Code cpp:

 
void MainWin::OnRoll(wxCommandEvent &Event)
{
    RollDice = new Dice(); //Appel au contructeur ci dessus.
    RollDice->Show(true);
    RollDice->ptr_vers_win=this; // Tu inialise le pointeur. Oui, mais trop tard, il y a déjà eu le segmentation fault.
}
 


Tu l'initialise, mais trop tard.
Tu peut à la place passer l'adresse dans le constructeur, ou accéder plus tard ( après avoir initialisé ton pointeur ) à ta MainWin.

Sinon, tu peut tout à fait mettre des // à la place des <<< pour les commentaires ;)

Dernière modification par 4ian (23-11-2008 15:09:37)


4ian

wwwcompilgames.net
23-11-2008 15:15:05  Re: Segmentation Fault..... #3
gbdivers (Membre)
Inscrit le : 05-03-2008
Messages: 92
Snippets: 2
Tutoriels: 0
Hors ligne
EDIT : 4ian a répondu avant moi !

Dans le code de MainWin::OnRoll, tu crée un object Dice en appelant le constructeur puis après tu attributs la variable ptr_vers_win. Hors dans le constructeur, tu utilise cette variable qui n'est pas encore attribuée.

Utilise un constructeur contenant la variable parent :

Code wxWidgets:

class Dice : public wxFrame
{
    public:
        Dice(MainWin* parent);     
    private:
        MainWin* m_Parent;
};
 
void MainWin::OnRoll(wxCommandEvent &Event)
{
    RollDice = new Dice(this);
    RollDice->Show(true);
}
 
Dice::Dice(MainWin* parent)
: wxFrame((wxFrame*) parent, -1, wxT("Action !"),
           wxDefaultPosition, wxSize(550,480)),
m_Parent(parent)
{
    ...     
    m_Parent->PersIni->SetPath(wxT("/"));
}

Dernière modification par gbdivers (24-11-2008 13:19:19)

23-11-2008 20:15:14  Re: Segmentation Fault..... #4
wxDidier (Membre)
Inscrit le : 14-09-2008
Messages: 24
Snippets: 0
Tutoriels: 0
Hors ligne
Effectivement c'est tout fait logique....

HAaaaa je m'en veux de ne pas avoir réfléchi dans ce sens !!
Pourtant je me suis creusé la tête mais au bon endroit :)

Merci beaucoup
Menu forum (navigation):
Pages: 1 Discussion fermée
 
Accueil » Accueil forums » Développement C/C++
» Segmentation Fault.....