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

Boost C++ Discussion :

Crash avec boost::function


Sujet :

Boost C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    R�dacteur
    Avatar de Bakura
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par d�faut Crash avec boost::function
    Bonsoir !

    Je dispose d'une classe de cam�ra qui peut mettre � jour la position de la camera de trois mani�res diff�rentes, selon le type de cam�ra choisie. J'ai pens� au d�but � faire trois if :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (typeCamera1)
    {
    //
    }
    else if (typeCamera2)
    {
    //
    }
    else
    {
    //
    }
    Toutefois ces fonctions �tant assez longues, cela m'aurait fait une fonction UpdatePosition() tr�s tr�s longue. J'ai donc pens� � faire un pointeur de fonction qui appelerait automatiquement la bonne fonction.

    Voici donc la signature de cette fonction :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    boost::function<void ()> updatePositionFunction;
    (variable membre priv�e)

    Dans le constructeur de la classe, j'attribue la fonction par d�faut :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    updatePositionFunction = boost::bind(&Camera::UpdatePositionFPS, this);
    Tout ce code compile correctement, le probl�me arrive avec la fonction UpdatePosition, qui doit appeler donc la bonne fonction :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    void UpdatePosition ()
    {
       updatePositionFunction; // Compile, mais n'appelle pas la fonction   UpdatePositionFPS
     
       updatePositionFunction(); // Compile, mais crash dès le début de l'application
    }
    D'autre part, est-il possible de traduire ce code sans utiliser boost (qu'avec la STL), tout en gardant une syntaxe pas trop d�gueue ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    D�tails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par d�faut
    Salut,

    Il faut que tu testes l'objet fonction avant de l'appeler :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    if( updatePositionFunction )
      updatePositionFunction();
    edit: cela dit non �a devrait �tre initialis� puisque tu le fais dans le constructeur...

    Sinon non je ne pense pas qu'il y ait une mani�re simple de parvenir � la m�me chose sans Boost.

    MAT.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    D�tails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par d�faut
    2e tentative...

    Ca l� :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    boost::function<void ()> updatePositionFunction;
    Personnellement je l'�cris plut�t :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    boost::function0<void> updatePositionFunction;
    Essaye peut-�tre pour voir ?

    MAT.

  4. #4
    r0d
    r0d est d�connect�
    Membre exp�riment�

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    4 299
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 4 299
    Billets dans le blog
    2
    Par d�faut
    Bonjour,

    je pense qu'il y a des fa�ons de faire beaucoup plus simple, et plus orient�e objet.
    Par exemple, surcharger tout simplement ta fonction updatePosition. Ou encore faire en sorte qu'updatePosition soit une fonction membre de l'interface Camera, cette interface �tant impl�ment�e pour chaque type de cam�ra.

    Ou alors il y a un truc que je n'ai pas compris...

  5. #5
    R�dacteur
    Avatar de Bakura
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par d�faut
    boost::function<void ()> updatePositionFunction;
    et
    boost::function0<void> updatePositionFunction;

    sont identiques d'apr�s la doc de boost, juste que la premi�re �criture est l'�criture recommand�e, et la seconde une qui est plus portable, visiblement.

    je pense qu'il y a des fa�ons de faire beaucoup plus simple, et plus orient�e objet.
    Par exemple, surcharger tout simplement ta fonction updatePosition. Ou encore faire en sorte qu'updatePosition soit une fonction membre de l'interface Camera, cette interface �tant impl�ment�e pour chaque type de cam�ra.

    Ou alors il y a un truc que je n'ai pas compris...
    Je ne pourrais pas surcharger ma fonction, vu qu'elles ont le m�me prototype :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    void UpdatePositionFPS ();
    void UpdatePositionFreeFly ();
    void UpdatePosition6DOF ();
    Quant � faire de l'h�ritage, j'aimerais �viter, j'aimerais garder cette classe assez compacte, et pas d�river trois classes juste pour une seule fonction :/. L� j'avais trouv� un moyen assez classe de r�gler ce probl�me, avec un truc comme �a :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void SetMode (CAMERA_TYPE type)
    {
       if (type == FPS)
          updatePositionFunction = boost::bind(&Camera::UpdatePositionFPS,               this);
       else if (type == FREEFLY)
          updatePositionFunction = boost::bind(&Camera::UpdatePositionFreeFly, this);
       else
          updatePositionFunction = boost::bind(&Camera::UpdatePosition6DOF, this);
    }
    Et hop, apr�s j'appelle la fonction UpdatePosition ind�feremment, qui appelera directement la bonne fonction. Ca m'�vite de faire trois �a :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void SetMode (CAMERA_TYPE type)
    {
       if (type == FPS)
          UpdatePositionFPS();
       else if (type == FREEFLY)
          UpdatePositionFreeFly();
       else
          UpdatePosition6DOF();
    }
    et d'avoir � faire � chaque fois des if qui, vraisemblablement, ne changeront qe tr�s peu souvent au cours du programme.

    Mat007 >
    edit: cela dit non �a devrait �tre initialis� puisque tu le fais dans le constructeur...
    Oui oui, j'allais quand m�me pas me faire avoir si facilement

  6. #6
    Alp
    Alp est d�connect�
    Expert confirm�

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 36
    Localisation : France, Bouches du Rh�ne (Provence Alpes C�te d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par d�faut
    Il n'existe pas de mani�re plus simple � ma connaissance.
    Ce sera toujours, dans le meilleur des cas, �quivalent.

    En d�buggant, tu obtiens quoi comme infos sur
    - le boost::function
    - l'endroit exact o� s'arr�te le programme (l'appel de la fonction ou le code qu'elle contient ?)
    ?

  7. #7
    R�dacteur
    Avatar de Bakura
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par d�faut
    Personne n'a d'id�e ?

  8. #8
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    D�tails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par d�faut
    Fais un code minimal qui reproduit le probl�me qu'on puisse le tester pour voir ?

    MAT.

  9. #9
    R�dacteur
    Avatar de Bakura
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par d�faut
    Hum... C'est pas clair. J'ai �crit ce code minimal :
    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
     
    class Foo
    {
    	public:
    		// Constructeur
    		Foo ()
    		{
    			// Initialise le pointeur de fonction à la fonction A
    			func = boost::bind(&Foo::A, this);
    		}
     
    		// Fonction A
    		void A ()
    		{
    			std::cout << "A est appele ?";
    		}
     
    		// Fonction B
    		void B ()
    		{
    			std::cout << "B est appele";
    		}
     
    		// Fonction qui appelle la fonction adéquate
    		void CallFunction ()
    		{
    			// Devrait appeler A
    			func();
    		}
     
    	private:
    		boost::function<void ()> func; // Identique à boost::function0<void> func
     
    };
     
    int main()
    {
    	Foo object;
    	object.CallFunction();
     
    	return EXIT_SUCCESS;
    }
    et l�, �a fonctionne . Tr�s �tonnant. Pourtant j'ai juste recopi� le cas de l'autre .

    EDIT : j'avoue ne pas comprendre. Dans mon main, mon objet Camera est une variable globale. L�, je cr�� un autre objet Camera non globale, sans rien appeler d'autre que le constructeur, et l� �a marche .

    EDIT 2 : bon, tout en gardant mon unique variable globale, et en incluant une fonction Bind en plus qui ne refait que ce que le constructeur fait (c'est � dire �a : updatePositionFunction = boost::bind(&Camera::UpdatePositionFPS, this);

    Et en appelant cette fonction Bind d�s le d�but, plus de soucis, comme si cela plantait dans le constructeur .

    EDIT 3 : bon, encore autre chose. Sans aucune fonction bind, si je d�finit le constructeur DIRECTEMENT dans la classe, comme dans le petit exemple plus haut, �a marche. Si je d�finie le constructeur inline et que je d�finie le constructeur dans le fichier hpp mais en dehors de la classe, �a marche aussi. Par contre d�s que je d�finie le constructeur dans le .cpp, �a plante .

    Est-ce un soucis de boost ?

  10. #10
    R�dacteur
    Avatar de Bakura
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par d�faut
    Je dois avouer que je ne comprends rien du tout � ce probl�me. J'ai refait un autre code minimal en s�parant fichier d'en-t�te et fichier d'impl�mentation, sans aucune fonction inline, avec une variable globale, et l� �a fonctionne. Par contre, quand c'est mon programme, �a plante ...

    EDIT : bon, j'ai refait des tests, et �a vient peut-�tre de SFML... Je ne veux pas l'accuser direct, mais c'est bizarre. En effet, j'ai fait un petit test d�s l'execution du programme, dans les premi�res lignes. J'ai test� ceci :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    Camera myCamera; // Variable globale (juste globale pour la facilité ici)
     
    int main()
    {
       // Ici, le constructeur de Camera est déjà appelé
       myCamera.UpdatePosition; // Cette fonction appelle juste l'objet de boost
    }
    Dans ce cas l�, la bonne fonction (UpdatePositionFPS) est bien appel�e. Par contre, si je change en faisant �a :

    sf::RenderWindow App;
    Camera myCamera;

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
    	// On commence par créer une fenêtre et un contexte valide pour OpenGL
    	App.Create (sf::VideoMode (800, 600), "Hola a todos");
    	App.ShowMouseCursor (false);
    	App.SetFramerateLimit (60);
     
    	myCamera.UpdatePosition();
    }
    L�, �a ne fonctionne plus, et la fonction n'est pas appel�e. Je vais essayer de me renseigner aupr�s de Laurent voir s'il n'y a pas quelque chose qui coince.

    EDIT 2 : ok, j'ai fait un code minimal, le conflit vient bien avec SFML. Je me renseigne aupr�s de Laurent.

  11. #11
    R�dacteur
    Avatar de Bakura
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par d�faut
    Bon, j'ai r�solu le soucis... C'�tait �videmment de ma faute... En fait, j'utilise une version b�ta de la SFML, et le dossier Include n'�tait pas � jour, et il fallait utiliser le dossier src, qui contenait les headers mis � jour, maintenant �a marche.

    Bref, tout �a � cause de �a :p.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 19
    Dernier message: 16/09/2008, 11h44
  2. [boost] Probl�me avec boost::function
    Par Bakura dans le forum Boost
    R�ponses: 3
    Dernier message: 22/03/2007, 20h08
  3. probleme de compilation avec boost
    Par doof dans le forum Biblioth�ques
    R�ponses: 7
    Dernier message: 07/06/2005, 21h38
  4. Calculer un inverse de matrice avec boost?
    Par Clad3 dans le forum Biblioth�ques
    R�ponses: 6
    Dernier message: 02/06/2005, 18h38
  5. probleme avec boost et devcpp
    Par Krost dans le forum Dev-C++
    R�ponses: 12
    Dernier message: 02/01/2005, 19h11

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