IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Histoire de pointeurs ...


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Points : 25
    Points
    25
    Par défaut Histoire de pointeurs ...
    Bonjour,

    J'ai un leger problème avec un pointeur :

    Je le déclare dans une classe comme suis : scheduleI* s;
    Puis je lui affecte une valeur comme suit : this->s = s; sachant qu'il est instancié en amont. Bref, jsuque la tout va bien.

    Ensuite, j'ai créé une fonction qui est appelée que sur évenement :

    void scheduleViewerI::OnPaint(wxPaintEvent& evt)
    {
    (...)
    // N° machine.
    wxFont MaFont3(12, wxROMAN , wxNORMAL, wxNORMAL, false);
    MonDc.SetFont(MaFont3);
    for (int i = 1; i <= s->fonction(); i++)
    MonDc.DrawText((wxString) "Machine n° " + IntToString(i), 5, 30*i);
    (...)
    }

    Et s n'existe plus, j'ai le droit à une erreur ...

    Qu'est ce qui peut bien se passer ?

    Merci d'avance

    ++ Eddy.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Normal, si s n'existe plus, on a plus le droit de faire s->fonction().

  3. #3
    Membre confirmé Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Points : 488
    Points
    488
    Par défaut
    Pleins de choses, quelle est cette erreur ?
    L'itération est humaine; la récursion, divine.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    le callback que tu as fourni n'est probablement pas bon, tu n'as pas du binder ton objet.
    Boost ftw

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Hum, à priori je déclare mon instance "s" dans la fonction main() donc l'instance "vit" jsuqu'à la fin du programme. Ensuite je la passe en parametre d'une instance d'un nouvel objet via un pointeur : "nouvel objet = new C(s)".

    Finalement, dans le constructeur de C, je link (j'affecte) s à un pointeur pour me permettre de le manipuler en aval.

    Cependant, ma classe C possede une fonction F qui doit utiliser "s", hors des que je cherche à lui faire appel, j'ai l'impression que l'objet n'existe plus ...

    Voici l'erreur :

    Exception non gérée à 0x0040d321 dans schedule.exe:0xC0000005: Violation d'accès lors de la lecture de l'emplacement 0x00000014.

    J'oubliais de dire que dans le constructueur j'ai aussi besoin de "s" et l'appel ne pose aucun probleme. C'est donc à la sortie du constructeur, lorsque mon programme appel ma fonction F (qui s'avere etre la fonction PAINT appelé sur evenement et décalrée dans la classe C) que l'objet "s" n'exsite plus.

    Merci,

    Eddy.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    Hum, Je vois pas très bien l'architecture de ton projet,
    mais bon:
    - Toujours tester ses pointeurs avant de les utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if(NULL !=s) {...}
    - faire this->s =s n'est-il pas équivalent à s=s ??

    - alors, que fait le destructeur sur "s" ?

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Luther13
    - faire this->s =s n'est-il pas équivalent à s=s ??
    Non, on peut avoir une variable locale s et une variable membre s.
    Est-ce que on peut avoir plus de code, là où est défini s, ...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Août 2003
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 159
    Points : 171
    Points
    171
    Par défaut
    Oui, je sais. Mais c'est juste pour souligner la confusion du nom des variables.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Points : 25
    Points
    25
    Par défaut
    Bonjour,

    Merci de votre aide

    Voici un peu de code :

    La fonction principale (c du wxWidget, correspond au main()) :

    bool MyApp::OnInit() {

    scheduleI* sI; <- le fameux pointeur s.
    wxString* infosOrdo;

    try {
    (...)
    scheduleViewerI *sched = new scheduleViewerI(fen, 1, "Schedule viewer", wxPoint(0, 0), wxSize(800, 300), sI, infosOrdo);
    (...)
    }
    catch(exception e){
    }
    }

    Le constructeur de scheduleViewerI :

    scheduleViewerI::scheduleViewerI(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, TOTALCOST_SCHED::scheduleI* s, wxString* infosOrdo):
    wxFrame(parent, id, title, pos, size, wxDEFAULT_FRAME_STYLE|wxFRAME_TOOL_WINDOW) {

    (...)

    // **** Linkage des variables.

    // L'ordonnancement associé.
    this->s = s;
    identifiant = id;
    this->infosOrdo = infosOrdo;

    (...)

    // Création et affichage des éléments graphiques.
    construireJobs(); // Cette fonction a besoin de s et tou fonctionne normalement.

    // Nous rendons la fenêtre visible.
    this->Show(TRUE);
    }

    Et finalement, une fonction événement de la classe scheduleViewerI qui a besoin de s et qui n'agit que sur évenement :

    void scheduleViewerI::OnPaint(wxPaintEvent& evt)
    {
    besoin de s ...
    }

    Et qd cette fonction est appelée ... c le drame

    Voila ,j'espere que ça pourra vous aider !

    Eddy.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Points : 25
    Points
    25
    Par défaut J'ai trouvé !!!
    Voici mon erreur :

    bool MyApp::OnInit() {
    scheduleI* sI;

    try {
    Problem p(...);
    schedule s(p);
    scheduleI I(s);
    sI = &I;
    } catch (...) {}
    }

    Lorsque je sors de mon try, l'objet I est détruit, et mon sI qui pointait dessus se retrouve pointer sur rien ! Alala ... je ne pensais pas qu'il serait détruit, en java c'est le garbage collector qui se charge de détruire ce qui n'est plus utilisé et lorsqu'un pointeur pointe encore sur un objet, il n'ai pas détruit ... !!! Dur dur, la transition

    En tout cas, merci bien à vous !!!

    ++ Eddy.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Un histoire de pointeurs ?
    Par monsterhunter dans le forum Débuter
    Réponses: 7
    Dernier message: 18/12/2013, 21h33
  2. Une histoire de pointeurs
    Par 0_Azerty_0 dans le forum Langage
    Réponses: 9
    Dernier message: 14/07/2012, 12h57
  3. Histoire de pointeur
    Par stmastma dans le forum Débuter
    Réponses: 6
    Dernier message: 19/10/2011, 21h36
  4. Encore une histoire de pointeur
    Par Supersami2000 dans le forum C
    Réponses: 5
    Dernier message: 11/07/2008, 13h42
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo