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 :

Problem d'appel de fonction


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 79
    Par défaut Problem d'appel de fonction
    Bonjour, cette fois j'ai un problème que je trouve assez étrange
    Pour commencer le code qui est concerné:

    Thread.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #include <pthread.h>
     
    class Thread
    {
       public:
          void Start(void * arg);
    	  pthread_t getThread() const {return m_Thread;}
     
       protected:
    	  Thread(void);
          void Run();
          static void * EntryPoint(void*);
          virtual void Setup()=0;
          virtual void Execute(void*)=0;
    	  void * Arg() const {return m_Arg;}
          void Arg(void* a){m_Arg = a;}
     
       private:
          pthread_t m_Thread;
          void * m_Arg;
     
    };
    Thread.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include "Thread.h"
    #include "..\..\..\Header.h"
     
    Thread::Thread() : m_Thread(), m_Arg(NULL)
    {
    }
     
    void Thread::Start(void * arg)
    {
       Arg(arg); // store user data
       pthread_create(&m_Thread, NULL, Thread::EntryPoint, Arg());
    }
     
    void Thread::Run()
    {
    	fprintf(stderr,"ici");
       this->Setup();
       this->Execute(m_Arg);
    }
     
    /*static */
    void * Thread::EntryPoint(void * thread)
    {
     
    	Thread * th = reinterpret_cast<Thread*>(thread);
    	th->Run();
    	return thread;
    }
    MenuGame.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #pragma once
     
    class ControlMenu;
    class Observable;
    #include "..\Base\Modules\Observer_Observable\Observer.h"
    #include "Game.h"
    #include "..\Base\Modules\Thread\Thread.h"
     
     
    class MenuGame
    	: public View, public Observer, public Thread
    {
    private:
    	ControlMenu *m_control;
     
    public:
    	MenuGame(ControlMenu *control);
    	void Setup();
        void Execute(void*);
    	void update(Observable*);
    };
    MenuGame.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    #include "MenuGame.h"
    #include "..\Model\MenuModel.h"
    #include "..\Control\ControlMenu.h"
     
    MenuGame::MenuGame(ControlMenu *control) : m_control(control)
    {
    }
     
    void MenuGame::update(Observable *model){
    	MenuModel *menu = dynamic_cast<MenuModel*>(model);
     
    	SDL_BlitSurface(menu->getBackground(),NULL,View::m_screen,NULL);
    	SDL_BlitSurface(menu->getCursor(),NULL,View::m_screen,&menu->getPositionCursor());
    }
     
    void MenuGame::Setup(void){
    	fprintf(stderr,"coucou");
    	m_control->assitSetup();
    }
     
    void MenuGame::Execute(void*){
     
    	fprintf(stderr,"execute ");
    	bool continuer= true;
     
    	while(continuer){
     
    		this->eventUpdate();
     
     
    		if (m_key[SDL_QUIT]){
    			continuer=false;
    		}
     
    		if (m_key[SDLK_UP]){
    			this->m_control->updateCursor(UP);
    		}
     
    		if (m_key[SDLK_DOWN]){
    			this->m_control->updateCursor(DOWN);
    		}
     
    		if (m_key[SDLK_RETURN]){
    			this->m_control->selectMode();
    		}
     
    	}
    }
    Main.c:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    #pragma once
     
    #include "Header.h"
    #include "Control\ControlMenu.h"
    #include "Model\MenuModel.h"
    #include "View\MenuGame.h"
     
    int main(int argc, char *argv[]){
     
    	MenuModel *model=new MenuModel();
     
    	ControlMenu *control=new ControlMenu(model);
     
     
    	MenuGame *view= new MenuGame(control);
     
    	view->Start(NULL);
    	fprintf(stderr,"%d ",view->getThread());
    	//pthread_join(view->getThread(), NULL);
     
    	return 0;
    }
    Voilà, le problème est que mon programme plante simplement quand j'appel la fonction Setup ou Execute dans la fonction Run, même si je met tout le contenu de la fonction en commentaire:


    First-chance exception at 0x01245ba0 in Bomberman.exe: 0xC0000005: Access violation reading location 0x00000000.
    Invalid parameter passed to C runtime function.
    Invalid parameter passed to C runtime function.
    The thread 'Win32 Thread' (0x117c) has exited with code 3 (0x3).
    The program '[4780] Bomberman.exe: Native' has exited with code 3 (0x3).


    quelqu'un peut m'expliquer pourquoi?
    Merci d'avance

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    "C runtime function"
    Je peux me tromper, mais la première chose qui me vient en tête, c'est extern "C" {};, qu'on peut placer autour de l'include de l'en-tête d'une bibliothèque compilée C. Je pense notemment à pthread.h.



    Par ailleurs, tu n'as apparemment pas de garde contre les inclusions multiples aux bons endroits. C'est quoi ce "pragma once" dans main.c, pourquoi n'y en a-t-il pas dans Thread.h?

    Et enfin, tu as des déclarations anticipées avant un include dans MenuGame.h.
    C'est dangereux, parce que tu déclares des choses qui sont visibles dans le contenu des en-têtes. Ce qui peut signifier que ces en-têtes ne sont pas complets.
    Et même si ce n'est pas le cas, c'est une faute de style.


    PS: pour ma culture perso, #pragma once, c'est standard?

  3. #3
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour,
    dans la fonction Thread::Start, c'est m_Arg qui est passé à pthread_create
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pthread_create(&m_Thread, NULL, Thread::EntryPoint, Arg());
    donc ce sera m_Arg que recevra Thread::EntryPoint ; m_Arg ne correspondant pas à object Thread valide et étant même égal à NULL dans l'exemple proposé, cela fait planter le programme (Setup et Execute étant virtuelles, la tentative d'accès à la vtable de l'objet provoque la violation d'accès : Access violation reading location 0x00000000).

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2011
    Messages : 79
    Par défaut
    et bien merci beaucoup pour vos réponses
    ça me rassure je croyais que mon erreur venait de mon c++ de base mais on dirait que c'est plus la bibliothèque, bien que l'erreur avec les méthodes virtuels est assez monstrueuse

    euh c'est moi ou il n'y a pas de fonction edit ici?
    le pragma once est standard je crois bien, je l'ai rajouté dans thread après avoir créé ce message car j'ai justement remarqué que je l'avais oublié

    et merci pour l'infos avec les déclarations

    edit :
    oh oui ici, désolé j'avais pas vu la commande éditer

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par leternel Voir le message
    Par ailleurs, tu n'as apparemment pas de garde contre les inclusions multiples aux bons endroits. C'est quoi ce "pragma once" dans main.c, pourquoi n'y en a-t-il pas dans Thread.h?

    [...]

    PS: pour ma culture perso, #pragma once, c'est standard?
    Non, mais c'est largement reconnu par les compilateurs; cela permet d'éviter les "gardes", moins efficaces en temps de compilation.

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Merci, je prends note.

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

Discussions similaires

  1. [XL-2003] Probleme sur appel de fonction auto depuis une cellule faisant une affectation
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 16/05/2011, 12h43
  2. Mystere probleme d'appel de fonction
    Par ze veritable farf dans le forum Qt
    Réponses: 3
    Dernier message: 15/09/2008, 20h56
  3. Probleme d'appel de fonction
    Par max44410 dans le forum Zend Framework
    Réponses: 1
    Dernier message: 29/06/2007, 07h39
  4. probleme d'appel de fonction!
    Par transistor49 dans le forum C++
    Réponses: 5
    Dernier message: 11/03/2005, 10h46
  5. Réponses: 8
    Dernier message: 13/08/2004, 12h32

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